خدمات تعتمد على الموقع Android Location Based Services

خدمات تعتمد على الموقع 

Android Location Based Services

خدمات تعتمد على الموقع Android Location Based Services

تسهل عليك واجهات برمجة التطبيقات لموقع Android من إنشاء تطبيقات مدركة للموقع دون الحاجة إلى التركيز على تفاصيل تقنية الموقع الأساسية.

 يصبح هذا ممكنًا بمساعدة خدمات Google Play ، التي تسهل إضافة الوعي بالموقع إلى تطبيقك من خلال التتبع التلقائي للموقع ، وتحديد المواقع الجغرافية والتعرف على النشاط.

 يوضح لك هذا البرنامج التعليمي كيفية استخدام خدمات الموقع في تطبيقك للحصول على الموقع الحالي ، والحصول على تحديثات الموقع الدورية ، والبحث عن عناوين إلخ.

كائن الموقع The Location Object

يمثل كائن الموقع موقعًا جغرافيًا يمكن أن يتكون من خطوط الطول والعرض والطابع الزمني ومعلومات أخرى مثل المحامل والارتفاع والسرعة.  هناك طرق مهمة يمكن استخدامها مع كائن الموقع للحصول على معلومات خاصة بالموقع -
الرقمالوصف 
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()
إرجاع سلسلة تحتوي على وصف موجز وقابل للقراءة البشرية لهذا الكائن.

الحصول على الموقع الحالي Get the Current Location

للحصول على الموقع الحالي ، قم بإنشاء عميل موقع وهو كائن LocationClient ، وقم بتوصيله بـ "خدمات الموقع" باستخدام طريقة الاتصال () ، ثم قم باستدعاء أسلوب getLastLocation () الخاص به.  تقوم هذه الطريقة بإرجاع أحدث موقع في شكل كائن الموقع الذي يحتوي على إحداثيات خطوط الطول والعرض وغيرها من المعلومات كما هو موضح أعلاه.  للحصول على وظيفة تعتمد على الموقع في نشاطك ، سيتعين عليك تنفيذ واجهتين -

 GooglePlayServicesClient.ConnectionCallbacks
 GooglePlayServicesClient.OnConnectionFailedListener
 توفر هذه الواجهات طرق رد اتصال مهمة ، والتي تحتاج إلى تنفيذها في فئة نشاطك -
الرقمدوال رد الاتصال والوصف
1
abstract void onConnected(Bundle connectionHint)
يتم استدعاء طريقة رد الاتصال هذه عند اتصال خدمة الموقع بنجاح بعميل الموقع.  سوف تستخدم طريقة connect () للاتصال بعميل الموقع.

2
abstract void onDisconnected()

تسمى طريقة رد الاتصال هذه عندما يتم قطع اتصال العميل.  سوف تستخدم طريقة disconnect () لقطع الاتصال من عميل الموقع.
3
abstract void onConnectionFailed(ConnectionResult result)

يتم استدعاء طريقة رد الاتصال هذه عندما حدث خطأ في توصيل العميل بالخدمة.
يجب عليك إنشاء عميل الموقع في طريقة onCreate () لفئة نشاطك ، ثم توصيله بـ onStart () حتى تحتفظ خدمات الموقع بالموقع الحالي بينما يكون نشاطك مرئيًا بالكامل.  يجب عليك فصل العميل في طريقة onStop () حتى لا يكون موقع خدمات الموقع هو الموقع الحالي عندما لا يكون تطبيقك مرئيًا.  هذا يساعد في توفير طاقة البطارية إلى حد كبير.

الحصول على تحديد الموقع Get the Updated Location

إذا كنت ترغب في الحصول على تحديثات الموقع ، بصرف النظر عن الواجهات المذكورة أعلاه ، فستحتاج إلى تنفيذ واجهة LocationListener أيضًا.  توفر هذه الواجهة طريقة رد الاتصال التالية ، والتي تحتاج إلى تنفيذها في فئة نشاطك -
الرقم.الدالة والوصف
1
ملخص الفراغ onLocationChanged (موقع الموقع)

 يتم استخدام طريقة رد الاتصال هذه لتلقي الإشعارات من LocationClient عندما يتغير الموقع.

موقع جودة الخدمة Location Quality of Service

يتم استخدام كائن LocationRequest لطلب جودة الخدمة (QoS) للحصول على تحديثات الموقع من LocationClient.  توجد طرق ضبط مفيدة والتي يمكنك استخدامها لمعالجة جودة الخدمة.  هناك طرق مكافئة متوفرة يمكنك التحقق من الوثائق الرسمية لنظام Android.
الرقم.الوصف والدالة
1
setExpirationDuration(long millis)
قم بتعيين مدة هذا الطلب ، بالمللي ثانية.
2
setExpirationTime(long millis)
قم بتعيين وقت انتهاء صلاحية الطلب ، بالميللي ثانية منذ بدء التشغيل.
3
setFastestInterval(long millis)
قم بتعيين أسرع فاصل زمني لتحديثات الموقع بشكل صريح ، بالمللي ثانية.

4
setInterval(long millis)
تعيين الفاصل الزمني المطلوب للحصول على تحديثات الموقع النشط ، بالميللي ثانية.

5
setNumUpdates(int numUpdates)
.اضبط عدد تحديثات الموقع
6
setPriority (الأولوية int)

 حدد أولوية الطلب.
الآن ، على سبيل المثال ، إذا كان التطبيق الخاص بك يريد موقعًا عالي الدقة ، فيجب أن ينشئ طلب موقع باستخدام setPriority (int) لتعيين PRIORITY_HIGH_ACCURACY و setInterval (طويلًا) إلى 5 ثوانٍ.  يمكنك أيضًا استخدام فاصل زمني أكبر و / أو أولويات أخرى مثل PRIORITY_LOW_POWER لطلب دقة مستوى "المدينة" أو PRIORITY_BALANCED_POWER_ACCURACY للحصول على دقة مستوى "حظر".
يجب أن تفكر الأنشطة بشدة في إزالة أي طلب موقع عند إدخال الخلفية (على سبيل المثال في onPause ()) ، أو على الأقل تبديل الطلب بفاصل زمني أكبر وجودة أقل لتوفير استهلاك الطاقة.

عرض عنوان الموقع Displaying a Location Address

بمجرد أن يكون لديك كائن الموقع ، يمكنك استخدام طريقة Geocoder.getFromLocation () للحصول على عنوان لخط الطول وخط الطول.  هذه الطريقة متزامنة ، وقد تستغرق وقتًا طويلاً للقيام بعملها ، لذلك يجب عليك استدعاء الطريقة من طريقة doInBackground () لفئة AsyncTask.

 يجب أن يكون AsyncTask فئة فرعية ليتم استخدامها وسوف تتخطى الفئة الفرعية طريقة doInBackground (Params ...) لتنفيذ مهمة في الخلفية ويتم استدعاء أسلوب onPostExecute (النتيجة) على مؤشر ترابط واجهة المستخدم بعد انتهاء حساب الخلفية وفي وقت انتهاء الحساب  عرض النتيجة.  هناك طريقة واحدة أكثر أهمية متوفرة في AyncTask والتي يتم تنفيذها (Params ... params) ، وهذه الطريقة تنفذ المهمة مع المعلمات المحددة.

مثال Example

يوضح لك المثال التالي كيفية استخدام خدمات الموقع في تطبيقك للحصول على الموقع الحالي وعناوينه المكافئة وما إلى ذلك.
لتجربة هذا المثال ، ستحتاج إلى جهاز جوال فعلي مجهز بأحدث نظام تشغيل Android ، وإلا فسيتعين عليك مواجهة محاكي قد لا يعمل.

إنشاء تطبيق Android

الخطوةالوصف
1.ستستخدم Android studio IDE لإنشاء تطبيق Android وتسميته كـ Tutorialspoint ضمن حزمة com.example.ahmedalmahallawi.myapplication
2.إضافة ملف src / GPSTracker.java وإضافة التعليمات البرمجية المطلوبة
3قم بتعديل ملف src / MainActivity.java وأضف الكود المطلوب كما هو موضح أدناه لرعاية الموقع الحالي وعنوانه المكافئ.
4قم بتعديل تنسيق ملف XML res / layout / activity_main.xml لإضافة جميع مكونات واجهة المستخدم الرسومية التي تتضمن ثلاثة أزرار وطريقة عرض نصين لإظهار الموقع / العنوان.
5قم بتعديل res / values ​​/ strings.xml لتحديد القيم الثابتة المطلوبة
6تعديل AndroidManifest.xml كما هو موضح أدناه
7قم بتشغيل التطبيق لتشغيل محاكي Android والتحقق من نتيجة التغييرات التي تمت في التطبيق.
فيما يلي محتوى ملف النشاط الرئيسي المعدل MainActivity.java.

package com.example.ahmedalmahallawi.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();
            }

         }
      });
   }
}
Following is the content of the modified main activity file 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"?>
 xmlns:android = "http://schemas.android.com/apk/res/android"
   android:layout_width = "fill_parent"
   android:layout_height = "fill_parent"
   android:orientation = "vertical" >


   
فيما يلي محتوى res / values ​​/ strings.xml لتحديد ثوابتين جديدتين -
xml version = "1.0" encoding = "utf-8"?>

    name = "app_name">Tutorialspoint

فيما يلي المحتوى الافتراضي لـ AndroidManifest.xml -
xml version = "1.0" encoding = "utf-8"?>
 xmlns:android = "http://schemas.android.com/apk/res/android"
   package = "com.example.ahmedalmahallawi.myapplication">
    android:name = "android.permission.ACCESS_FINE_LOCATION" />
    android:name = "android.permission.INTERNET" />
   
      android:allowBackup = "true"
      android:icon = "@mipmap/ic_launcher"
      android:label = "@string/app_name"
      android:supportsRtl = "true"
      android:theme = "@style/AppTheme">
  
       android:name = ".MainActivity">
         
             android:name = "android.intent.action.MAIN" />

             android:name = "android.intent.category.LAUNCHER" />
         
دعنا نحاول تشغيل تطبيق ahmedalmahallawi الخاص بك.  أفترض أنك قمت بتوصيل جهاز Android Mobile الفعلي بجهاز الكمبيوتر الخاص بك.  لتشغيل التطبيق من Android Studio ، افتح أحد ملفات أنشطة المشروع وانقر على أيقونة Run Eclipse Run Icon من شريط الأدوات.  قبل بدء تشغيل التطبيق الخاص بك ، سيعرض مثبت استوديو أندرويد النافذة التالية لتحديد خيار حيث تريد تشغيل تطبيق Android الخاص بك.
Android Mobile Device
الآن لرؤية الموقع ، حدد "الحصول على زر الموقع" الذي سيعرض معلومات الموقع على النحو التالي -


Android Mobile Location Info