API های لوکیشن اندروید بدون اینکه نیاز باشد به جزئیات مربوط به فناوری های مکان تمرکز کنیم ساخت برنامه های مکان نما را برایمان آسان می کنند. این امر با کمک خدمات Google Play امکان پذیر می شود، که افزودن آگاهی از موقعیت را با تقسیم بندی خودکار موقعیت،geofencing و شناسایی فعالیت آسان می کند.

سرویس های مبتنی بر موقعیت در اندروید ، به شما نشان می دهد که چگونه از خدمات مکانی در برنامه ی خود استفاده کنید تا مکان کنونی و آپدیت های دوره ای موقعیت را بگیرید و یا چگونه به دنبال آدرس ها بگردید و غیره.

آبجکت موقعیت

آبجکت موقعیت نشان می دهد که یک موقعیت جغرافیایی می تواند شامل عرض جغرافیایی، طول جغرافیایی و جدول زمانی و دیگر اطلاعات مانند جهت و ارتفاع باشد. در زیر روش های مهمی وجود دارند که می توانید با آبجکت موقعیت برای گرفتن اطلاعات یک مکان خاص از آن ها استفاده کنید.

شماره متدها و توصیفات
1 float distanceTo(Location dest)

مسافت بین این موقعیت و موقعیت داده شده را به متر برمی گرداند.

2 (float getAccuracy)

صحت تقریبی این موقعیت را به متر به دست می آورد.

3 (double getAltitude)

ارتفاع از سطح دریا را، اگر در دسترس باشد، به دست می آورد.

4 (float getBearing)

جهت را به درجه به دست می آورد.

5 (double getLatitude)

عرض جغرافیایی را به درجه به دست می آورد.

6 (double getLongitude)
طول جغرافیایی را به درجه به دست می آورد.
7 (float getSpeed)

سرعت را اگر در دسترس باشد، در متر بر ثانیه به دست می آورد.

8 (boolean hasAccuracy)

درست، اگر این موقعیت درست باشد.

9 (boolean hasAltitude)

درست، اگر این موقعیت دارای ارتفاع باشد.

10 (boolean hasBearing)

درست، اگر این موقعیت دارای جهت باشد.

11 (boolean hasSpeed)

درست، اگر این موقعیت دارای سرعت باشد.

12 void reset()

محتوای مربوط به موقعیت را واضح می کند.

13 void setAccuracy(float accuracy)

درستی برآورد شده ی این موقعیت را به متر تنظیم می کند.

14 void setAltitude(double altitude)

ارتفاع را از سطح دریا به متر تنظیم می کند.

15 void setBearing(float bearing)

جهت را به درجه تنظیم می کند.

16 void setLatitude(double latitude)

عرض جغرافیایی را به درجه تنظیم می کند.

17 void setLongitude(double longitude)

طول جغرافیایی را به درجه تنظیم می کند.

18 void setSpeed(float speed)

سرعت را به متر برثانیه در سطح زمین تنظیم می کند.

19 (String toString)

یک رشته شامل توصیفات فشرده و خوانا از این آبجکت را برمی گرداند.

دریافت مکان فعلی

برای بدست آوردن مکان فعلی، یک کلاینت را ایجاد کنید که شیء LocationClient باشد، آن را با استفاده از روش ()connect به Location Services متصل کنید و سپس روش ()getLastLocation آن را دریافت کنید. این روش آخرین مکان را به شکل شیء موقعیت مکانی که حاوی مختصات طول و عرض جغرافیایی و سایر اطلاعات است که در بالا توضیح داده می شود، به دست می آورد. برای داشتن قابلیت مکان بر اساس فعالیت خود، شما باید دو رابط را اجرا کنید:

  • GooglePlayServicesClient.ConnectionCallbacks
  • GooglePlayServicesClient.OnConnectionFailedListener

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

شماره روش فراخوانی و توضیحات
1 (abstract void onConnected)

این روش هنگامی فراخوانی می شود که سرویس موقعیت مکانی به طور موفقیت آمیز به مشتری مکان متصل می شود. شما از روش ()connect برای اتصال به مشتری مکان استفاده می کنید.

2 (abstract void onDisconnected)

این روش فراخوانی زمانی خوانده می شود که مشتری قطع شود. شما از روش ()disconnect برای قطع اتصال از مشتری موقعیت استفاده می کنید.

3 (abstract void onConnectionFailed)

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

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

دریافت محل به روز رسانی

اگر قادر هستید که آپدیت های موقعیت را داشته باشید، علاوه بر اینترفیس های ذکر شده در بالا، لازم است که اینترفیس LocationListener را نیز اجرا کنید. این اینترفیس روش بازخورد زیر را ارائه می دهدکه شما برای اجرای فعالیت گروه خود به آن نیاز دارید.

شماره روش فراخوانی و توضیحات
1 (abstract void onLocationChanged)

این روش فراخوانی برای دریافت اعلان ها از LocationClient هنگامی که مکان تغییر کرده است استفاده می شود.

کیفیت موقعیت سرویس(Location Quality of Service)

شیء LocationRequest برای درخواست کیفیت خدمات (QoS) برای به روز رسانی مکان از LocationClient استفاده می شود. روش های Setter زیر مفید هستند که می توانید برای رسیدگی به QoS استفاده کنید. روش های گریتر معادل موجود است که می توانید در مستندات رسمی اندروید بررسی کنید

شماره روش و توضیحات
1 (setExpirationDuration)

مدت زمان این درخواست را در میلی ثانیه تنظیم کنید.

2 (setExpirationTime)

زمان انقضای درخواست را در millisecond از زمان بوت تنظیم کنید.

3 (setFastestInterval)

به طور صریح سریع ترین فاصله برای به روز رسانی مکان ها را در میلی ثانیه تنظیم کنید.

4 (setInterval)

فاصله زمانی مورد نظر برای به روز رسانی مکان فعال را در میلی ثانیه تنظیم کنید.

5 (setNumUpdates)

تعدادی از به روز رسانی مکان را تنظیم کنید.

6 (setPriority)

اولویت درخواست را تنظیم کنید.

حالا برای مثال، اگر برنامه شما دارای موقعیت دقت بالا باشد، باید یک درخواست مکان را با setPriority تنظیم شده به PRIORITY_HIGH_ACCURACY و setInterval به ۵ ثانیه ایجاد کنید. شما همچنین می توانید از فاصله زمانی و / یا اولویت های دیگر مانند PRIORITY_LOW_POWER برای درخواست دقت سطح شهر یا PRIORITY_BALANCED_POWER_ACCURACY برای دقت سطح بلوک استفاده کنید.

فعالیت ها باید توجه داشته باشند که در هنگام ورود زمینه تمام درخواست های موقعیت را حذف کنند (برای مثال در onPause()) یا حداقل درخواست را به یک وقفه ی طولانی تر و کیفیت پایین تر تغییر دهند تا مصرف نیروی باتری را ذخیره کنند.

نمایش آدرس یک موقعیت

هنگامی که شما محل شی را داشته باشید، می توانید از روش ()Geocoder.getFromLocation برای دریافت یک آدرس برای عرض و طول داده شده استفاده کنید. این روش همزمان است و ممکن است طول بکشد تا کار خود را انجام دهد، بنابراین شما باید روش را از روش ()doInBackground کلاس AsyncTask فراخوانی کنید.

AsyncTask باید زیر کلاس باشد تا مورد استفاده قرار گیرد و زیر کلاس روش doInBackground را برای انجام یک کار در پس زمینه جایگزین می کند و روش onPostExecute در رشته ی UI پس از پایان محاسبات پس زمینه و در زمان نمایش نتیجه می گیرد. یک روش مهم دیگر در AyncTask وجود دارد که اجرا می شود، این روش کار را با پارامترهای مشخص شده انجام می دهد.

مثال

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

برای آرمایش با ابن مثال شما به یک موبایل مجهز شده به آخرین نسخه ی Android OS نیاز خواهید داشت. در غیر این صورت مجبورخواهید بود تلاش خود را با مقلدی انجام دهید که ممکن است به درستی کار نکند.

ایجاد برنامه Android

گام توضیحات
1 شما از Android Studio IDE برای ایجاد یک برنامه Android استفاده می کنید و آن را به عنوان Tutorialspoint تحت یک بسته com.example.tutorialspoint7.myapplication نام گذاری می کنید.
2 فایل src / GPSTracker.java را اضافه کنید و کد مورد نیاز را اضافه کنید.
3 تغییر فایل src / MainActivity.java و اضافه کردن کد مورد نیاز به عنوان زیر نشان داده شده برای مراقبت از گرفتن موقعیت فعلی و آدرس معادل آن
4 اصلاح طرح XML فایل res / layout / activity_main.xml برای اضافه کردن تمام اجزای GUI که شامل سه دکمه و دو نمایش متن برای نشان دادن محل / آدرس است.
5 تغییر مقادیر res / values / strings.xml برای تعیین مقادیر ثابت لازم
6 اصلاح AndroidManifest.xml به صورت زیر نشان داده شده است
7 برنامه را اجرا کنید تا شبیه ساز اندروید را راه اندازی کنید و نتیجه تغییرات انجام شده در برنامه را تأیید کنید.

در زیر محتوای اصلی فایل اصلی MainActivity.java اصلاح شده است.

 

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 تغییر یافته است.

 

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 قرار خواهد گرفت:

 

<?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 خواهد بود تا دو ثابت جدید را تعریف کند.

 

<?xml version = "1.0" encoding = "utf-8"?>
<resources>
   <string name = "app_name">Tutorialspoint</string>
</resources>

 

در ادامه، محتویات پیش فرض AndroidManifest.xml است:

 

<?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 شما را اجرا کنیم. فرض می کنم، دستگاه واقعی Android Mobile خود را با رایانه خود وصل کرده اید. برای اجرای برنامه از Android Studio، یکی از فایل های فعالیت پروژه خود را باز کنید و روی آیکون RunEclipse Run Icon از نوار ابزار کلیک کنید. قبل از شروع برنامه خود، نصب کننده Android studio پنجره زیر را نمایش می دهد تا گزینه ای را انتخاب کنید که در آن می خواهید برنامه Android خود را اجرا کنید.

 

 

اکنون برای دیدن موقعیت مکانی انتخاب کنید دکمه Location Button را انتخاب کنید که اطلاعات مکان را به صورت زیر نمایش می دهد:

 

Android Mobile Location Info