سرویس های مبتنی بر مکان در برنامه نویسی اندروید
سرویس های مبتنی بر مکان در برنامه نویسی اندروید
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، در مورد سرویس های مبتنی بر مکان در برنامه نویسی اندروید صحبت خواهیم کرد.
API های موقعیت مکانی اندروید بدون نیاز به تمرکز روی جزئیات فناوری مکان اصلی، ساخت برنامه های آگاه از موقعیت مکانی را برای شما آسان می کند.
این کار با کمک سرویس های Google Play امکان پذیر می شود، که با ردیابی مکان خودکار و تشخیص فعالیت آگاهی از موقعیت مکانی را به برنامه شما اضافه می کند.
این آموزش به شما نشان می دهد که چگونه از سرویس های مبتنی بر مکان در برنامه نویسی اندروید در برنامه خود برای دریافت مکان فعلی، به روزرسانی های دوره ای مکان، جستجوی آدرس ها و غیره استفاده کنید.
شی Location
شی Location موقعیت جغرافیایی را نشان می دهد که می تواند شامل عرض جغرافیایی، طول جغرافیایی، زمان و سایر اطلاعات مانند تحمل، ارتفاع و سرعت باشد. روش های مهم زیر وجود دارد که می توانید با استفاده از شی Location برای دریافت اطلاعات خاص مکان استفاده کرد.
(float distanceTo(Location dest
فاصله تقریبی را به متر بین این مکان و مکان داده شده برمی گرداند.
()float getAccuracy
دقت تقریبی این مکان را بر حسب متر
()double getAltitude
در صورت وجود ، ارتفاع را بر حسب متر از سطح دریا دریافت می کند
()float getBearing
تحمل را بر حسب درجه دریافت می کند
()double getLatitude
عرض جغرافیایی را بر حسب درجه دریافت کنید.
()double getLongitude
طول را بر حسب درجه دریافت می کند
()float getSpeed
در صورت موجود بودن سرعت را بر حسب متر بر ثانیه بر روی زمین دریافت می کند.
()boolean hasAcuracy
اگر مکان فعلی دقت داشته باشد 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 به سرویس های موقعیت مکانی متصل کنید و سپس با متد () getLastLocation آن را فراخوانی کنید. این متد جدیدترین مکان را به صورت شی Location که حاوی مختصات عرض و طول و سایر اطلاعات همانطور که در بالا توضیح داده شد ، برمی گرداند. برای داشتن عملکرد مبتنی بر مکان در فعالیت خود، باید دو رابط را پیاده سازی کنید –
- GooglePlayServicesClient.ConnectionCallbacks
- GooglePlayServicesClient.OnConnectionFailedListener
این رابط ها متد های زیر را برای پاسخگویی مهیا می کند که شما باید در کلاس فعالیت خود آن ها را پیاده سازی کنید:
- (abstract void onConnected(Bundle connectionHint
این روش پاسخگویی هنگامی فراخوانی می شود که سرویس موقعیت مکانی با موفقیت به مکان کلاینت متصل شود. برای اتصال به مکان کلاینت از متد اتصال ( connect استفاده خواهید کرد.
- ()abstract void onDisconnected
این روش پاسخگویی در هنگام قطع ارتباط مشتری است. برای قطع ارتباط با سرویس گیرنده مکان، از متد ()disconnect استفاده خواهید کرد.
- (abstract void onConnectionFailed(ConnectionResult result
این روش تماس هنگامی فراخوانی می شود که خطایی در اتصال کلاینت به سرویس وجود داشته باشد.
شما باید سرویس گیرنده مکان را با استفاده از متد ()onCreate کلاس فعالیت خود ایجاد کنید، سپس آن را در ()onStart متصل کنید، به طوری که خدمات موقعیت مکانی مکان فعلی را حفظ کند در حالی که فعالیت شما کاملاً قابل مشاهده است. شما باید کلاینت را با متد () onStop قطع کنید، بنابراین وقتی برنامه شما قابل مشاهده نیست ، خدمات موقعیت مکانی را حفظ نمی کند. این امر تا حد زیادی در صرفه جویی در مصرف باتری کمک می کند.
دریافت موقعیت مکانی به روز شده
اگر می خواهید به روزرسانی موقعیت مکانی داشته باشید، جدا از اینترفیس هایی که در بالا به آن ها اشاره کردیم، باید رابط LocationListener را نیز پیاده سازی کنید. این رابط روش بازخوانی زیر را ارائه می دهد ، که شما باید در کلاس activity خود پیاده سازی کنید –
- (abstract void onLocationChanged(Location location
این روش پاسخگویی برای دریافت نوتیفیکیشن ها از LocationClient هنگام تغییر مکان استفاده می شود.
کیفیت موقعیت مکانی
شی Location LocationRequest برای درخواست کیفیت خدمات (QoS) برای به روزرسانی مکان از LocationClient استفاده می شود. روشهای زیر برای تنظیم کننده مفید وجود دارد که می توانید از آنها برای کنترل کیفیت موقعیت مکانی استفاده کنید. روشهای جالبی برای دریافت وجود دارد که می توانید آنها را بررسی کنید.
(setExpirationDuration(long millis
مدت زمان این درخواست را بر حسب میلی ثانیه تنظیم می کند
(setExpirationTime(long millis
زمان انقضا درخواست را از زمان راه اندازی بر حسب میلی ثانیه تنظیم می کند
(setFastestInterval(long millis
به صراحت سریعترین فاصله را برای به روزرسانی مکان، در میلی ثانیه تنظیم می کند.
(setInterval(long millis
فاصله مورد نظر را برای به روزرسانی های مکان فعال، بر حسب میلی ثانیه تنظیم می کند.
(setNumUpdates (int numUpdates)
تعداد به روزرسانی های مکان را تنظیم می کند.
(setPriority(int priority
اولویت درخواست را تنظیم می کند.
اکنون به عنوان مثال ، اگر برنامه شما مکان با دقت بالا می خواهد ، باید یک درخواست مکان با (setPriority (int تنظیم شده روی PRIORITY_HIGH_ACCURACY و setInterval تا 5 ثانیه ایجاد کند.
برای درخواست صحت سطح “شهر” یا PRIORITY_BALANCED_POWER_ACCURACY برای دقت سطح “بلوک” همچنین می توانید از فاصله بزرگتر و یا اولویت های دیگری مانند PRIORITY_LOW_POWER استفاده کنید.
نمایش آدرس موقعیت مکانی
پس از داشتن موقعیت مکانی، می توانید از متد () Geocoder.getFromLocation برای گرفتن آدرس برای طول و عرض جغرافیایی مشخص استفاده کنید. این روش همزمان است و ممکن است مدت زمان زیادی طول بکشد تا کار خود را انجام دهد، بنابراین شما باید متد را از روش ()doInBackground کلاس AsyncTask فراخوانی کنید.
AsyncTask باید زیر کلاس باشد تا مورد استفاده قرار گیرد و زیر کلاس برای انجام وظیفه در پس زمینه روش (execute(Params… params را نادیده می گیرد و متد onPostExecute (نتیجه) پس از اتمام محاسبه پس زمینه و در زمان استفاده از موضوع UI فراخوانی می شود. نمایش نتیجه یک متد مهم دیگر در AyncTask وجود دارد که اجرا می شود (Params … params) ، این متد وظیفه را با پارامترهای مشخص شده اجرا می کند.
مثال
مثال زیر به شما نشان می دهد که چگونه از سرویس های مبتنی بر مکان در اندروید در برنامه خود برای به دست آوردن مکان فعلی و آدرس های معادل آن و غیره استفاده کنید.
برای آزمایش این مثال ، شما به یک تلفن همراه مجهز به جدیدترین سیستم عامل اندروید نیاز خواهید داشت
1 شما برای ایجاد یک برنامه Android از Android studio IDE استفاده خواهید کرد و نام آن را به عنوان Tutorialspoint در یک بسته com.example.tutorialspoint7.myapplication قرار دهید.
2 پرونده src / GPSTracker.java را اضافه کرده و کد لازم را اضافه کنید.
3 پرونده src / MainActivity.java را اصلاح کرده و کد مورد نیاز را مانند تصویر زیر اضافه کنید تا از محل فعلی و آدرس معادل آن محافظت کنید.
4 طرح XML فایل res / layout / activity_main.xml را تغییر دهید تا تمام مولفه های GUI که شامل سه دکمه و دو text view برای نشان دادن مکان / آدرس است، اضافه شود.
5 res / Value / strings.xml را تغییر دهید تا مقادیر ثابت مورد نیاز تعریف شود
6 AndroidManifest.xml را مطابق شکل زیر تغییر دهید
7 برای راه اندازی شبیه ساز اندروید و تأیید نتیجه تغییرات انجام شده در برنامه، برنامه را اجرا کنید.
در زیر محتوای پرونده فعالیت اصلی تغییر یافته 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.tutorialspoint7.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(); } } }); } } |
در زیر محتوای پرونده فعالیت اصلی اصلاح شده 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 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
package com.example.tutorialspoint7.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 // The minimum distance to change Updates in meters 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); // getting GPS status isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); // getting network status isNetworkEnabled = locationManager .isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled && !isNetworkEnabled) { // no network provider is enabled } else { this.canGetLocation = true; // First get location from Network Provider 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(); } } } // if GPS Enabled get lat/long using GPS Services 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; } /** * Stop using GPS listener * Calling this function will stop using GPS in your app * */ public void stopUsingGPS(){ if(locationManager != null){ locationManager.removeUpdates(GPSTracker.this); } } /** * Function to get latitude * */ public double getLatitude(){ if(location != null){ latitude = location.getLatitude(); } // return latitude return latitude; } /** * Function to get longitude * */ public double getLongitude(){ if(location != null){ longitude = location.getLongitude(); } // return longitude return longitude; } /** * Function to check GPS/wifi enabled * @return boolean * */ 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.tutorialspoint7.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> |
بیایید برنامه Tutorialspoint شما را اجرا کنیم. من تصور می کنم شما AVD خود را هنگام راه اندازی محیط ایجاد کرده اید. برای اجرای برنامه از Android studio، یکی از پرونده های فعالیت پروژه خود را باز کنید و از نوار ابزار روی کلیک کنید. Android Studio برنامه را روی AVD شما نصب کرده و شروع به کار می کند و اگر با تنظیمات و برنامه هایتان همه چیز خوب باشد، زیر پنجره شبیه ساز نمایش داده می شود.
اکنون برای دیدن مکان دکمه Get Location را انتخاب کنید که اطلاعات مکان را به صورت زیر نمایش می دهد
لیست جلسات قبل آموزش برنامه نویسی اندروید
- نگاهی کلی به برنامه نویسی اندروید
- تنظیمات محیط در برنامه نویسی اندروید
- معماری برنامه نویسی اندروید
- اجزای برنامه در برنامه نویسی اندروید
- Hello World در برنامه نویسی اندروید
- سازماندهی و دسترسی به منابع در برنامه نویسی اندروید
- فعالیت در برنامه نویسی اندروید
- سرویس در برنامه نویسی اندروید
- گیرنده های پخش در برنامه نویسی اندروید
- ارائه دهنده محتوا در برنامه نویسی اندروید
- قطعات در برنامه نویسی اندروید
- Intent و فیلتر در برنامه نویسی اندروید
- طرح بندی رابط کاربری در برنامه نویسی اندروید
- کنترل های رابط کاربری در برنامه نویسی اندروید
- مدیریت رویدادها در برنامه نویسی اندروید
- استایل و تم ها در برنامه نویسی اندروید
- اجزای سفارشی در برنامه نویسی اندروید
- کشیدن و رها کردن در برنامه نویسی اندروید
- نوتیفیکیشن ها در برنامه نویسی اندروید
دیدگاه شما