امروزه اغلب دستگاه های مبتنی بر سیستم عامل اندروید این امکان را برای کاربران فراهم می کنند تا مکان جغرافیایی جاری دستگاه را بدست بیاورند. این امر از طریق ماژول GPS، wifi یا تکنیک مثلث سازی برج های مخابراتی امکان پذیر می باشد.
Google Play با استفاده از fused location provider آخرین مکان جغرافیایی دستگاه جاری را بازیابی می کند.
نصب
به منظور استفاده از location manager، سرویس Google play را در قالب dependency به فایل build.gradle اضافه نمایید.
dependencies { compile 'com.google.android.gms:play-services:9.2.0' compile 'com.google.android.gms:play-services-location:9.2.0' }
همچنین بایستی مجوز مورد نیاز را در فایل تنظمیات اپلیکیشن اندرویدی، manifest، اعلان نمایید.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
استفاده از LocationManager
اکنون می توانید به آخرین مکان جغرافیایی دستگاه دسترسی داشته باشید. fuse location provider توابع کتابخانه ای نوین و کارایی در اختیار توسعه دهنده قرار می دهد که کار مکان یابی را انجام می دهد. در زیر مثالی را مشاهده می کنید که از این توابع برای واکشی اطلاعات مکان جاری دستگاه استفاده می کند.
بدست آوردن مختصات جغرافیایی به صورت دو طرفه (forward and reverse geocoding)
کلاس Geocoder به شما این امکان را می دهد تا مختصات جغرافیایی (عرض و طول جغرافیایی) یک مکان را بر اساس آدرس ارائه شده بدست آورده و بالعکس (بر اساس عرض و طول جغرافیایی ارائه شده، آدرس دقیق مثل اسم خیابان محل قرارگیری دستگاه را بدست آورید). از این پروسه تحت عنوان reverse geocoding یاد می شود. کلاس نام برده از یک سرویس آنلاین Google استفاده می کند.
امنیت
اگر می خواهید به حسگر GPS دسترسی داشته باشید، در آن صورت لازم است مجوز ACCESS_FINE_LOCATION را نیز اعلان نمایید. در غیر این صورت باید ACCESS_COARSE_LOCATION را در فایل تنظیمات اعلان کنید.
درخواست از کاربر برای فعال سازی حسگر GPS (امکان سخت افزاری GPS یا مکان یاب)
کاربر باید تصمیم بگیرد که امکان سخت افزاری GPS فعال شود یا خیر.
می توانید با فراخوانی متدisProviderEnabled() مطمئن شوید آیا LocationManager فعال و پیاده سازی شده است یا خیر (LocationManager کلاسی است که امکان دسترسی به سرویس های مکان یابی سیستم را فراهم می کند). در صورتی که فعال نشده باشد، می توانید به واسطه ی ارسال یک آبجکت Intent که مقدار خاصیت name از المان action آن (اسم action) در فایل xml، بر روی Settings.ACTION_LOCATION_SOURCE_SETTINGS تنظیم شده به کلاس android.provider.Settings ، کاربر را به بخش تنظیمات مربوطه ارجاع دهید.
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE); boolean enabled = service .isProviderEnabled(LocationManager.GPS_PROVIDER); // check if enabled and if not send user to the GSP settings // Better solution would be to display a dialog and suggesting to // go to the settings if (!enabled) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); }
معمولا به این صورت است که توسعه دهنده یک AlarmDialog در نمایشگر باز می کند که از کاربر می پرسد آیا می خواهد امکان سخت افزاری GPS را فعال کند یا اینکه اجرای اپلیکیشن مربوطه باید کلا لغو گردد.
لازم به ذکر است که شما نمی توانید به طور مستقیم امکان GPS را در کد برنامه فعال کنید بلکه کاربر باید آن را به صورت دستی فعال کند.
فعال سازی امکان GPS در محیط شبیه ساز
لازم است امکان GPS را بر روی دستگاه تست گیری خود فعال نمایید. اگر اپلیکیشن را بر روی محیط شبیه ساز تست نمایید، در حالی که امکان GPS فعال نشده باشد، کلاس LocationManager مقدار null را برمی گرداند.
activity یا صفحه ی Google Map، بایستی به صورت خودکار امکان سخت افزاری GPS را در شبیه ساز فعال کند. اما چنانچه می خواهید از location manager به طور مسقیم استفاده نمایید، بایستی این کار را خود انجام دهید. در حال حاضر مشکلاتی برای استفاده ی مستقیم از location manager وجود دارد.
Google Maps را در محیط شبیه ساز اجرا کرده و درخواست اطلاعات موقعیت جغرافیایی جاری را بدهید. این کار به شما اجازه می دهد تا GPS را فعال نمایید. مختصات جدید GPS را به شبیه ساز اندروید ارسال نمایید.
تنظیم موقعیت جغرافیایی
می توانید با استفاده از “DDMS” Perspective محیط کاری Eclipse، موقعیت جغرافیایی خود را به شبیه ساز یا دستگاه متصل ارسال نمایید. برای این منظور، ابتدا Perspective را باز کرده و سپس مسیر رو به رو را طی نمایید: Window ▸ Open Perspective ▸ Other… ▸ DDMS.
(perspective اسمی که به مجموعه ای از view ها و ناحیه ی ویرایشگر اشاره محیط کاری Eclipse اشاره دارد)
(DDMS که سرنام واژگان Dalvik debug monitor service است کاراترین ابزار اشکال زدایی برای پروژه های اندرویدی بوده و از قابلیت های آن می توان به گزارش گیری و نمایش اطلاعات file manager اشاره کرد. این ابزار قادر است به عنوان یک برنامه ی جدا راه اندازی شده و بر دستگاه میزبان نظارت داشته باشد.)
می توانید در Emulator Control، مختصات جغرافیایی را وارد کرده و دکمه ی Send را فشار دهید

همچنین می توانید مختصات جغرافیایی را در شبیه ساز Android از طریق telnet تنظیم نمایید. پنجره ی فرمان یا کنسول را باز کرده و به دستگاه دلخواه متصل شوید. شماره ی port دستگاه شما در نوار عنوان (title area) شبیه ساز قابل مشاهده می باشد.
telnet localhost 5554
حال از طریق دستور زیر موقعیت جغرافیایی را مقداردهی و تنظیم نمایید.
ساخت پروژه
یک پروژه ی و activity جدید به ترتیب به نام de.vogella.android.locationapi.simple و ShowLocationActivity ایجاد نمایید.
گفتنی است که این مثال از Google Map استفاده نمی کند و بجای محیط شبیه ساز بر روی دستگاه واقعی اندروید اجرا می شود.
فایل layout خود را از res/layout_ به کد زیر ویرایش نمایید.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="40dip" android:orientation="horizontal" > <TextView android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dip" android:layout_marginRight="5dip" android:text="Latitude: " android:textSize="20dip" > </TextView> <TextView android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="unknown" android:textSize="20dip" > </TextView> </LinearLayout> <LinearLayout android:id="@+id/linearLayout2" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/TextView03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dip" android:layout_marginRight="5dip" android:text="Longitute: " android:textSize="20dip" > </TextView> <TextView android:id="@+id/TextView04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="unknown" android:textSize="20dip" > </TextView> </LinearLayout> </LinearLayout>
افزودن مجوزهای لازم
مجوزهای زیر را در فایل تنظیمات اپلیکیشن (AndroidManifest.xml) اعلان نمایید.
- INTERNET
- ACCESS_FINE_LOCATION
- ACCESS_COARSE_LOCATION
ویرایش کلاس Activity
محتوای کلاس ShowLocationActivity را به صورت زیر ویرایش نمایید. با اعمال تغییرات زیر از location manger کوئری گرفته شده و مقادیر مورد درخواست (خروجی) در activity به نمایش گذاشته می شوند.
package de.vogella.android.locationsapi.simple; import android.app.Activity; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast; public class ShowLocationActivity extends Activity implements LocationListener { private TextView latituteField; private TextView longitudeField; private LocationManager locationManager; private String provider; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); latituteField = (TextView) findViewById(R.id.TextView02); longitudeField = (TextView) findViewById(R.id.TextView04); // Get the location manager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // Define the criteria how to select the locatioin provider -> use // default Criteria criteria = new Criteria(); provider = locationManager.getBestProvider(criteria, false); Location location = locationManager.getLastKnownLocation(provider); // Initialize the location fields if (location != null) { System.out.println("Provider " + provider + " has been selected."); onLocationChanged(location); } else { latituteField.setText("Location not available"); longitudeField.setText("Location not available"); } } /* Request updates at startup */ @Override protected void onResume() { super.onResume(); locationManager.requestLocationUpdates(provider, 400, 1, this); } /* Remove the locationlistener updates when Activity is paused */ @Override protected void onPause() { super.onPause(); locationManager.removeUpdates(this); } @Override public void onLocationChanged(Location location) { int lat = (int) (location.getLatitude()); int lng = (int) (location.getLongitude()); latituteField.setText(String.valueOf(lat)); longitudeField.setText(String.valueOf(lng)); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { Toast.makeText(this, "Enabled new provider " + provider, Toast.LENGTH_SHORT).show(); } @Override public void onProviderDisabled(String provider) { Toast.makeText(this, "Disabled provider " + provider, Toast.LENGTH_SHORT).show(); } }
اجرا و تست
اگر از شبیه ساز استفاده می کنید، مختصات جغرافیایی مورد نظر را به دستگاه ارسال کنید. با کلیک بر روی دکمه، مختصات جغرافیایی به نمایش گذاشته می شود.
امیدواریم آموزش سرویس های اختصاصی در اندروید نیز برای شما مفید واقع شده باشد و ادامه آموزش برنامه نویسی اندروید رو دنبال کنید . برای مطالعه پستها بیشتر ، ما را در مدرسه کدنویسی تلگرام و یا در تی جوان اینستاگرام دنبال کنید.
نظراتتون رو زیر همین پست با ما به اشتراک بگذارید.