با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش برنامه نویسی اندروید را دنبال می کنند. API های موقعیت مکانی Android بدون نیاز به تمرکز بر جزئیات تکنولوژی موقعیت مکانی، برای شما دسترسی و اجرای برنامه های کاربردی ناشناخته را آسان می کند. افزودن این قابلیت به برنامه های اندروید با افزودن سرویس Google Play امکان پذیر است که باعث ردیابی خودکار موقعیت مکانی شما ، geofencing و تشخیص activity می شود،در ادامه ی مباحث این آموزش برای آشنایی با سرویس های مبتنی بر مکان در اندروید با ما همراه باشید.
در ادامه ی مباحث سرویس های مبتنی بر مکان در اندروید، شما را چگونگی استفاده از خدمات موقعیت مکانی در APP آشنا می کنیم.
Location یک مکان جغرافیایی را نشان می دهد که می تواند از عرض جغرافیایی، طول جغرافیایی، زمان و سایر اطلاعات مانند تحمل، ارتفاع و سرعت باشد.
متد های مهمی در زیر وجود دارد که شما می توانید با استفاده از شیء Location برای دریافت اطلاعات خاص مکان از آن استفاده کنید:
ردیف | متد و توضیحات |
---|---|
۱ | float distanceTo(Location dest) فاصله تقریبی در متر بین این محل و محل مشخص شده را نشان می دهد. |
۲ | float getAccuracy() دقت تخمینی این مکان را در متر تحویل می دهد. |
۳ | double getAltitude() ارتفاع در صورت موجود بودن، برحسب متر بالاتر از سطح دریا محاسبه می کند. |
۴ | float getBearing() دریافت تحمل، در درجه. |
۵ | double getLatitude() عرض جغرافیایی را در درجه بندی می کند. |
۶ | double getLongitude() طول جغرافیایی، بر حسب در درجه بر می گرداند. |
۷ | float getSpeed() سرعت را بر حسب متر بر ثانیه بر می گرداند. |
۸ | boolean hasAccuracy() اگر مکتن فعلی دقت داشته باشد True را برمی گرداند. |
۹ | boolean hasAltitude() اگر مکان فعلی ارتفاع داشته باشد Trueرا برمی گرداند. |
۱۰ | boolean hasBearing() اگر مکان دارای تحمل باشد Trueرا برمی گرداند. |
۱۱ | boolean hasSpeed() اگر مکان دارای یک سرعت باشد True را برمی گرداند. |
۱۲ | void reset() محتویات محل پاک می شود. |
۱۳ | void setAccuracy(float accuracy) متراج را تنظیم می کند. |
۱۴ | void setAltitude(double altitude) ارتفاع را در متر از سطح دریا تنظیم می کند. |
۱۵ | void setBearing(float bearing) bearing را در درجه بندی قرار دهید. |
۱۶ | void setLatitude(double latitude) عرض جغرافیایی را در درجه بندی می کند. |
۱۷ | void setLongitude(double longitude) طول جغرافیایی را در درجه بندی می کند. |
۱۸ | void setSpeed(float speed) سرعت را بر حسب متر بر ثانیه در زمین محاسبه می کند. |
۱۹ | String toString() یک رشته حاوی توضیحات مختصر که برای انسان قابل درک باشد را برمی گرداند. |
برای بدست آوردن مکان فعلی، یک کلاینت را ایجاد کنید که شیء LocationClient باشد.
سپس آن را با استفاده از متد ()connect به Location Services متصل کنید.
سپس با متد getLastLocation () آن را دریافت کنید.
این متد آخرین موقعیت مکانی را به شکل شیء موقعیت مکانی که حاوی مختصات طول و عرض جغرافیایی و سایر اطلاعات است که در بالا توضیح داده می شود، به دست می آورد.
برای داشتن قابلیت مکان بر اساس فعالیت خود، شما باید دو رابط کاربری را اجرا کنید:
این اینترفیس ها متد های زیر را برای پاسخگویی مهیا می کند که شما باید در کلاس فعالیت خود پیاده سازی کنید:
ردیف | متد و توضیحات آن |
---|---|
۱ | abstract void onConnected(Bundle connectionHint) این متد زمانیکه کاربر به سرویس موقعیت مکانی (با متد () connect که توسط برنامه نویس به کار رفته) متصل شود فراخوانی می شود.
|
۲ | abstract void onDisconnected() این متد زمانیکه کاربر (با متد ()disconnect که توسط برنامه نویس به کار رفته ) سرویس موقعیت مکانی را قطع کند فراخوانی می شود.
|
۳ | abstract void onConnectionFailed(ConnectionResult result) این روش فراخوانی هنگامی رخ می دهد که یک خطا در اتصال مشتری به سرویس وجود داشته باشد. |
شما باید در کلاینت () locationCreate از کلاس فعالیت خود ایجاد کنید.
سپس آن را در () onStart متصل کنید، به طوری که خدمات مکان، محل فعلی را حفظ می کنند.
در حالی که فعالیت شما به طور کامل قابل مشاهده است. شما باید مشتری را در متد () onStop جدا کنید.
زمانی که برنامه قابل مشاهده نباشد، سرویس موقعیت مکانی قطع می شود که این به کاهش مصرف باتری بسیار می کند.
با استفاده از اینترفیس LocationListener می توانید موقعیت مکانی خود را آپدیت کنید.
این اینترفیس متد بازگشتی زیر را فراهم می کند:
ردیف | متد و توضیحات آن |
---|---|
۱ | abstract void onLocationChanged(Location location) از این متد برای دریافت اطلاعیه ها از LocationClient زمانی که مکان تغییر کند استفاده می شود. |
شیء LocationRequest برای درخواست کیفیت سرویس (QoS) برای به روز رسانی مکان از LocationClient استفاده می کند.
متدهای Setter زیر برای دسترسی به سرویس (QoS) کاربرد دارند:
ردیف | متد و توضیحات مربوطه |
---|---|
۱ | setExpirationDuration(long millis) مدت زمان درخواست را در میلی ثانیه تنظیم می کند. |
۲ | setExpirationTime(long millis) زمان انقضای درخواست را در millisecond از زمان بوت تنظیم می کند. |
۳ | setFastestInterval(long millis) سریع ترین فاصله را برای به روز رسانی مکان ها را در میلی ثانیه تنظیم می کند.
|
۴ | setInterval(long millis) فاصله زمانی مورد نظر را برای به روز رسانی مکان فعال در میلی ثانیه تنظیم می کند. |
۵ | setNumUpdates(int numUpdates) تعداد آپدیت های مکان را تنظظیم می کند. |
۶ | setPriority(int priority) اولویت درخواست ها را تنظیم می کند. |
اکنون برای مثال، اگر برنامه شما موقعیت مکانی دقت بالا را داشته باشد، باید درخواست موقعیت مکانی را با setPriority (int) تعیین شده به PRIORITY_HIGH_ACCURACY و setInterval (long) تا ۵ ثانیه ایجاد کنید.
شما همچنین می توانید از فاصله زمانی و / یا اولویت های دیگر مانند PRIORITY_LOW_POWER برای درخواست دقت سطح شهر یا PRIORITY_BALANCED_POWER_ACCURACY برای دقت سطح بلوک استفاده کنید.
هنگامی که محل شی را داشته باشید، می توانید از متد () Geocoder.getFromLocation برای دریافت یک آدرس بر اساس عرض و طول داده شده استفاده کنید.
این متد همزمان اجرا می شود و ممکن است طول بکشد تا کار خود را انجام دهد.
بنابراین شما باید متد را با استفاده از از متد ()doInBackground کلاس AsyncTask فراخوانی کنید.
AsyncTask باید طبقه بندی شود تا مورد استفاده قرار گیرد و زیر کلاس متد doInBackground (Params ...)
را برای انجام یک کار در پس زمینه جایگزین می کند.
متد OnPostExecute (Result)
بعد از پایان محاسبات پس از اتمام در محدوده UI فراخوانی می شود.
در آن زمان نمایش نتایج یکی از متد های مهم دیگری که در AyncTask موجود است اجرا می شود.
مثال زیر به شما نحوه استفاده از خدمات موقعیت مکانی در برنامه خود نشان می دهد تا مکان فعلی و آدرس معادل آن را دریافت کنید:
برای آزمایش این مثال، شما نیاز به دستگاه واقعی تلفن همراه مجهز به آخرین سیستم عامل آندروید دارید.
چرا که شبیه ساز اندروید ممکن است برای اجرای این مثال به خوبی کار نکند.
مراحل | توضیحات |
---|---|
۱ | مراحل ایجاد برنامه در اندروید استدیو را طبق بخش های قبلی دنبال کرده و نام پکیج را com.pvlearn.pvlearn.myapplication قرار بدهید. |
۲ | فایل src/GPSTracker.java را به همراه کد های مورد نیاز ایجاد کنید. |
۳ | محتوای فایل src / MainActivity.java را با افزودن کدی که موقعیت مکانی را دریافت کرده و آدرس آن را حفظ کند ویرایش کنید. |
۴ | به محتوای فایل res / layout / activity_main.xml سه Button و دو text view برای نمایش موقعیت مکانی و آدرس اضافه کنید. |
۵ | محتوای فایل res/values/strings.xml را برای مقدارهای ثابت تغییر دهید. |
۶ | محتوای AndroidManifest.xml را همانطور که در ادامه نشان می دهیم تغییر دهید. |
۷ | برنامه را اجرا کنید تا شبیه ساز اندروید نتیجه را نمایش دهد. |
محتوای ویرایش شده ی main activity که در فایل MainActivity.java است ، به صورت زیر خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | package com.example.Pvlearn.myapplication; import android.Manifest; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.test.mock.MockPackageManager; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { Button btnShowLocation; private static final int REQUEST_CODE_PERMISSION = 2; String mPermission = Manifest.permission.ACCESS_FINE_LOCATION; // GPSTracker class GPSTracker gps; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { if (ActivityCompat.checkSelfPermission(this, mPermission) != MockPackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{mPermission}, REQUEST_CODE_PERMISSION); // If any permission above not allowed by user, this condition will execute every time, else your else part will work } } catch (Exception e) { e.printStackTrace(); } btnShowLocation = (Button) findViewById(R.id.button); // show location button click event btnShowLocation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // create class object gps = new GPSTracker(MainActivity.this); // check if GPS enabled if(gps.canGetLocation()){ double latitude = gps.getLatitude(); double longitude = gps.getLongitude(); // \n is for new line Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show(); }else{ // can't get location // GPS or Network is not enabled // Ask user to enable GPS/network in settings gps.showSettingsAlert(); } } }); } } |
محتوای فایل main activity که تغییر یافته در فایل GPSTracker.java به صورت زیر خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | package com.example.Pvlearn.myapplication; import android.app.AlertDialog; import android.app.Service; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.provider.Settings; import android.util.Log; public class GPSTracker extends Service implements LocationListener { private final Context mContext; // flag for GPS status boolean isGPSEnabled = false; // flag for network status boolean isNetworkEnabled = false; // flag for GPS status boolean canGetLocation = false; Location location; // location double latitude; // latitude double longitude; // longitude private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters // The minimum time between updates in milliseconds private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute // Declaring a Location Manager protected LocationManager locationManager; public GPSTracker(Context context) { this.mContext = context; getLocation(); } public Location getLocation() { try { locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); // دریافت وضعیت gps isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); //در یافت وضعیت شبکه isNetworkEnabled = locationManager .isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled && !isNetworkEnabled) { } else { this.canGetLocation = true; // دریافت موقعیت مکانی if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("Network", "Network"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } // بررسی سرویس GPS if (isGPSEnabled) { if (location == null) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("GPS Enabled", "GPS Enabled"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } } } } catch (Exception e) { e.printStackTrace(); } return location; } public void stopUsingGPS(){ if(locationManager != null){ locationManager.removeUpdates(GPSTracker.this); } } public double getLatitude(){ if(location != null){ latitude = location.getLatitude(); } // return latitude return latitude; } public double getLongitude(){ if(location != null){ longitude = location.getLongitude(); } // return longitude return longitude; } public boolean canGetLocation() { return this.canGetLocation; } /** * Function to show settings alert dialog * On pressing Settings button will lauch Settings Options * */ public void showSettingsAlert(){ AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); // Setting Dialog Title alertDialog.setTitle("GPS is settings"); // Setting Dialog Message alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); // On pressing Settings button alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); mContext.startActivity(intent); } }); // on pressing cancel button alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); // Showing Alert Message alertDialog.show(); } @Override public void onLocationChanged(Location location) { } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public IBinder onBind(Intent arg0) { return null; } } |
محتوای فایل res/layout/activity_main.xml :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?xml version = "1.0" encoding = "utf-8"?> <LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:orientation = "vertical" > <Button android:id = "@+id/button" android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:text = "getlocation"/> </LinearLayout> |
محتوای فایل رشته ای res/values/strings.xml:
1 2 3 4 | <?xml version = "1.0" encoding = "utf-8"?> <resources> <string name = "app_name">Tutorialspoint</string> </resources> |
محتوای پیش فرض فایل AndroidManifest.xml :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?xml version = "1.0" encoding = "utf-8"?> <manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "com.example.Pvlearn.myapplication"> <uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name = "android.permission.INTERNET" /> <application android:allowBackup = "true" android:icon = "@mipmap/ic_launcher" android:label = "@string/app_name" android:supportsRtl = "true" android:theme = "@style/AppTheme"> <activity android:name = ".MainActivity"> <intent-filter> <action android:name = "android.intent.action.MAIN" /> <category android:name = "android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
برای اجرای برنامه ی اندرویدی خود یکی از فایل های activity در برنامه ی خود کلیک کنید.
سپس روی نماد (Run) از نوار ابزار برای شروع اجرای برنامه کلیک کنید.
اگر همه چیز بخوبی پیش برود شبیه ساز اندروید پنجره ی زیر را نمایش خواهد داد:
اکنون برای دیدن موقعیت مکانی دکمه Get Location را انتخاب کنید که اطلاعات مکان را به صورت زیر نمایش می دهد:
یکی از قابلیت های ویژه ی اندروید قابلیت دسترسی و نمایش اطلاعات مربوط به موقعیت مکانی است که کاربردهای بسیار زیادی در اپلیکیشن های مختلف اندروید دارد، از این رو مباحث این بخش را به سرویس های مبتنی بر مکان در اندروید اختصاص دادیم.