رفتن به مطلب

نمایش نقشه و انتخاب مکان به کمک webview (به همراه نمایش موقعیت فعلی کاربر)


fun_code

ارسال‌های توصیه شده

سلام و عرض ادب

احتمالا نیاز شده که بخواید در اپلیکیشن خودتون نقشه رو نمایش بدید و از کاربر بخواید مکان مورد نظرش رو انتخاب کنه...

گاهی نقشه گوگل نمایش داده نمیشه و اخیرا هم متوجه شدم گوگل نقشه رو از حالت رایگان خارج کرده...

کتابخانه osm هم طبق بررسی کند هست و نقشه رو خیلی کند لود میکنه.

بنابراین بهترین راه ، استفاده از نقشه های ایرانی است که حداقل برای استفاده از سرویس های خاص بتونیم به ریال اکانت مون رو شارژ کنیم.

البته برای موردی که در این آموزش بیان میکنم (نمایش نقشه و انتخاب مکان) نیاز به پرداخت وجه نیست.

در این آموزش از نقشه نشان استفاده میکنم که جالبه بدونید هر ماه 100 هزار تومان هم اکانت ها رو بصورت رایگان شارژ میکنه.(هدیه 100 هزار تومانی در ابتدای هر ماه)

صرفا جهت اطلاعاتون ، مواردی چون مسیریابی و تبدیل مکان به ادرس و ... هزینه در بر خواهند داشت.

بنده خواستم نقشه نشان رو با SDK که خودشون برای B4A ساختن نمایش بدم اما حدود 35 مگابایت به سایز فایل APK اضافه شد !!!!

بنابراین تصمیم گرفتم اینکار رو با استفاده از یک فایل PHP انجام بدم و صفحه رو در webView بارگزاری کنم.

برای استفاده از خدمات سایت نشان نیاز به ساخت کلید دسترسی است.

پس در ابتدا از طریق لینک  https://platform.neshan.org/panel/login در سایت ثبت نام کنید. پس از ورود به داشبورد از منو بالا گزینه کلیدهای دسترسی را انتخاب و سپس گزینه ایجاد کلید دسترسی را کلیک کنید.

برای رفع نیاز نمایش و انتخاب لوکیشن روی نقشه تنها به web key نیاز است. پس در صفحه ایجاد کلید دسترسی پس از وارد کردن نام ، گزینه نقشه وب را انتخاب نمایید. اگر قصد دارید این کلید برای IP یا دامنه خاصی محدود باشد آن را در بخش مربوطه وارد نمایید. (تعیین دامنه الزامی نیست.)

پس از ذخیره کلید دسترسی به شما نمایش داده می شود و کلید دسترسی را کپی نمایید.

پس از آن فایل پیوست شده با نام select location.zip را که حاوی سورس B4A و فایل های سمت سرور (PHP و جاوا اسکریپت) است را دانلود کنید :

پس از Extract فایل در پوشه host فایل server.js را باز کنید و کلید دسترسی را در خط 9 در متغیر key جایگذاری نمایید.

سپس هر دو فایل موجود در پوشه host را در مسیر روت دامنه یا پوشه مورد نظرتان آپلود نمایید.

خب تنها چیزی که باقی مانده اینه که در پوشه b4a سورس رو باز کنید و در اکتیویتی map نام دامنه یا مسیر فایل های آپلود شده رو در متغیر your_domain وارد کنید. ( برای مثال:   example.ir  یا  example.ir/map )

اگر هم کاربر قبلا موقعیت رو انتخاب و در دیتابیس ذخیره کردید و قصد دارید در ابتدا همون نقطه رو نمایش بدید ، کافیه در اکتیویتی main پیش از نمایش اکتیویتی map مقادیر lat و lon رو مقداردهی کنید و اگر تمایل دارید مقدار zoom را افزایش دهید.

برای مسیریابی و ... هم میتونید مثال های سایت نشان رو مطالعه کنید و بدون اینکه بخواید سایز اپلیکیشن رو افزایش بدید از نقشه به خوبی استفاده کنید.

گاها نیاز میشه که بخواید لوکیشن انتخابی کاربر رو در سایت نمایش بدید. چیزی مشابه سایت دیوار. نشان یک API کاربردی هم ساخته که lat , lon رو در پارامتر center به همراه چند پارامتر دیگه مثل zoom میفرستید و یک اسنپ شات (عکس) از لوکیشن رو نمایش میده.

نکته مهم در استفاده از این API اینه که در پارامتر key باید کلید دسترسی سرویس بسازید و کلید رو به این پارامتر بدید.

لینک آموزش API :

https://developers.neshan.org/tools/static-map-maker

 

اگر قصد دارید بصورت آفلاین و بدون آپلود فایل ها در هاست از سورس بنده استفاده کنید ، کافیه مراحلی که در لینک زیر بیان کردم رو دنبال کنید :

 

از اونجایی که ممکنه یکی از کتابخانه های JSInterface و FusedLocationProvider و WebViewExtras2 و GPS رو برای اجرای سورس نداشته باشید ، اینا رو هم تک تک پیوست میکنم که هر کدوم رو نداشتید دانلود کنید.

 

امیدوارم که این تاپیک براتون مفید باشه و استفاده لازم رو ببرید.

موفق باشید

select location.zip

JSInterface.zip

FusedLocationProvider.zip

WebViewExtras2.zip GPS.zip

لینک ارسال
به اشتراک گذاری در سایت های دیگر

سلام.

دوست عزیز بسیار بسیار زحمت کشیدید که این سورس گرانبها رو رایگان منتشر کردید.

از شما ممنونم.

و میشه لطف کنید و کتابخانه JSInterface رو هم بذارید؟

ممنون.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

1 ساعت قبل، batman123 گفته است:

سلام.

دوست عزیز بسیار بسیار زحمت کشیدید که این سورس گرانبها رو رایگان منتشر کردید.

از شما ممنونم.

و میشه لطف کنید و کتابخانه JSInterface رو هم بذارید؟

ممنون.

درود بر شما

خواهش میکنم ، چیز خاصی نبود.

کتابخانه هایی که احتمال دادم شاید برخی دوستان نداشته باشن رو در پست اول پیوست کردم.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

7 ساعت قبل، batman123 گفته است:

سلام و درود

برای من این خطا میاد

 

چه روی گوشی چه روی شبیه ساز

ممنون میشم راهنماییم کنید.

درود بر شما

اگر قصد دارید بصورت آفلاین استفاده کنید و فایل ها رو در هاست آپلود نکنید ، کارهای زیر رو انجام دهید:

محتوای پوشه host رو در پوشه Files کپی کنید.(فراموش نکنید که باید web key رو در فایل server.js قرار بدید.)

کتابخانه JavaObject رو فعال کنید.

تابع زیر رو به کدهای اکتیویتی map اضافه کنید.

Sub WebViewAssetFile (FileName As String) As String
	Dim jo As JavaObject
	jo.InitializeStatic("anywheresoftware.b4a.objects.streams.File")
	If jo.GetField("virtualAssetsFolder") = Null Then
		Return "file:///android_asset/" & FileName.ToLowerCase
	Else
		Return "file://" & File.Combine(jo.GetField("virtualAssetsFolder"), _
       jo.RunMethod("getUnpackedVirtualAssetFile", Array As Object(FileName)))
	End If
End Sub

کد زیر رو کامنت یا حذف کنید. (در 2 رویداد این خط کد وجود دارد. رویداد های Activity_Create و WebViewClient1_OverrideUrl)

wve.LoadUrl("http://" & your_domain & "/map.php?lat=" & lat & "&lon=" & lon & "&zoom=" & zoom)

و کد زیر رو بجای آن ها قرار دهید :

wve.LoadUrl(WebViewAssetFile("map.php?lat=" & lat & "&lon=" & lon & "&zoom=" & zoom))

ایده استفاده آفلاین از نشان بد نیست و حقیقتا به ذهن خودمم نرسید اما ، دقت داشته باشید که اگر 1 درصد فایل apk شما رو اکسترکت کنن و web key شما رو از فایل server.js بردارن میتونن با اعتبار اکانت (سایت نشان) شما بصورت رایگان در سایت یا اپلیکیشن خود از خدمات نشان بهره ببرن و شارژ اکانت شما رو صفر کنن.

موفق باشید. 😊

map.jpg.dcbfdb659a494f525fe9c5d921feafa0.jpg

لینک ارسال
به اشتراک گذاری در سایت های دیگر

18 ساعت قبل، fun_code گفته است:

درود بر شما

اگر قصد دارید بصورت آفلاین استفاده کنید و فایل ها رو در هاست آپلود نکنید ، کارهای زیر رو انجام دهید:

محتوای پوشه host رو در پوشه Files کپی کنید.(فراموش نکنید که باید web key رو در فایل server.js قرار بدید.)

کتابخانه JavaObject رو فعال کنید.

تابع زیر رو به کدهای اکتیویتی map اضافه کنید.

Sub WebViewAssetFile (FileName As String) As String
	Dim jo As JavaObject
	jo.InitializeStatic("anywheresoftware.b4a.objects.streams.File")
	If jo.GetField("virtualAssetsFolder") = Null Then
		Return "file:///android_asset/" & FileName.ToLowerCase
	Else
		Return "file://" & File.Combine(jo.GetField("virtualAssetsFolder"), _
       jo.RunMethod("getUnpackedVirtualAssetFile", Array As Object(FileName)))
	End If
End Sub

کد زیر رو کامنت یا حذف کنید. (در 2 رویداد این خط کد وجود دارد. رویداد های Activity_Create و WebViewClient1_OverrideUrl)

wve.LoadUrl("http://" & your_domain & "/map.php?lat=" & lat & "&lon=" & lon & "&zoom=" & zoom)

و کد زیر رو بجای آن ها قرار دهید :

wve.LoadUrl(WebViewAssetFile("map.php?lat=" & lat & "&lon=" & lon & "&zoom=" & zoom))

ایده استفاده آفلاین از نشان بد نیست و حقیقتا به ذهن خودمم نرسید اما ، دقت داشته باشید که اگر 1 درصد فایل apk شما رو اکسترکت کنن و web key شما رو از فایل server.js بردارن میتونن با اعتبار اکانت (سایت نشان) شما بصورت رایگان در سایت یا اپلیکیشن خود از خدمات نشان بهره ببرن و شارژ اکانت شما رو صفر کنن.

موفق باشید. 😊

map.jpg.dcbfdb659a494f525fe9c5d921feafa0.jpg

خب خیلی هم عالی دوست عزیز

با این کار نقشه توی برنامه لود میشه. ( ولی باس به نت وصل بود )

 

اما دوتا سوال:

یکی این که چرا نشانه گر همیشه توی میدونه آزادیه؟

دوم این که چرا وقتی تصویر مشخص شده رو توی تصویر زیر میزنم، برنامه این شکلی خطا میده:

image_processing20200424-22029-udgx52_3s

لینک ارسال
به اشتراک گذاری در سایت های دیگر

۲ ساعت قبل، batman۱۲۳ گفته است:

خب خیلی هم عالی دوست عزیز

با این کار نقشه توی برنامه لود میشه. ( ولی باس به نت وصل بود )

 

اما دوتا سوال:

یکی این که چرا نشانه گر همیشه توی میدونه آزادیه؟

دوم این که چرا وقتی تصویر مشخص شده رو توی تصویر زیر میزنم، برنامه این شکلی خطا میده:

image_processing20200424-22029-udgx52_3s

سلام دوست عزیز

قاعدتا برای لود نقشه میخواد با سایت نشان ارتباط برقرار کنه و web key هم برای همین هست.

نقشه آفلاین نیست که ! نقشه آفلاین با سایز 54 کیلوبایت نداریم که ! شما (مجموعا با سایز کتابخانه ها) با 54 کیلوبایت در اپلیکیشنتون نقشه رو نمایش میدید.

پس اینترنت لازمه...

پاسخ سوال اول ، در اکتیویتی Main و در رویداد showMap_Click اومدم lat , lon میدان آزادی رو دادم.

در اولین پست هم عرض کردم شما میتونید مقدار اولیه lat , lon رو بسته به انتخاب قبلی کاربر که ذخیره کردید مشخص کنید و zoom رو هم افزایش بدید. حق انتخاب با شماست.

پاسخ سوال دوم ، در پیام قبلی عرض کردم باید دو خط کد رو تغییر بدید. شما خط دوم در رویداد WebViewClient1_OverrideUrl رو تغییر نداید.

ضمنا، تعیین موقعیت فعلی با GPS رو در گوشی حقیقی تست کنید چون در شبیه ساز جایی رو نشون میده که خالی هست.

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...