سرویس های مبتنی بر مکان در برنامه نویسی اندروید

4 سال پیش

سرویس های مبتنی بر مکان در برنامه نویسی اندروید

در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، در مورد سرویس های مبتنی بر مکان در برنامه نویسی اندروید صحبت خواهیم کرد.

 

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  تا ۵ ثانیه ایجاد کند.

برای درخواست صحت سطح “شهر” یا PRIORITY_BALANCED_POWER_ACCURACY برای دقت سطح “بلوک” همچنین می توانید از فاصله بزرگتر و یا اولویت های دیگری مانند PRIORITY_LOW_POWER استفاده کنید.

 

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

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

AsyncTask باید زیر کلاس باشد تا مورد استفاده قرار گیرد و زیر کلاس برای انجام وظیفه در پس زمینه روش (execute(Params… params را نادیده می گیرد و متد onPostExecute (نتیجه) پس از اتمام محاسبه پس زمینه و در زمان استفاده از موضوع UI فراخوانی می شود. نمایش نتیجه یک متد مهم دیگر در AyncTask وجود دارد که اجرا می شود (Params … params) ، این متد وظیفه را با پارامترهای مشخص شده اجرا می کند.

مثال

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

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

۱ شما برای ایجاد یک برنامه Android از Android studio IDE استفاده خواهید کرد و نام آن را به عنوان Tutorialspoint در یک بسته com.example.tutorialspoint7.myapplication قرار دهید.
۲ پرونده src / GPSTracker.java را اضافه کرده و کد لازم را اضافه کنید.
۳ پرونده src / MainActivity.java را اصلاح کرده و کد مورد نیاز را مانند تصویر زیر اضافه کنید تا از محل فعلی و آدرس معادل آن محافظت کنید.
۴ طرح XML فایل res / layout / activity_main.xml را تغییر دهید تا تمام مولفه های GUI که شامل سه دکمه و دو text view برای نشان دادن مکان / آدرس است، اضافه شود.
۵ res / Value / strings.xml را تغییر دهید تا مقادیر ثابت مورد نیاز تعریف شود
۶ AndroidManifest.xml را مطابق شکل زیر تغییر دهید
۷ برای راه اندازی شبیه ساز اندروید و تأیید نتیجه تغییرات انجام شده در برنامه، برنامه را اجرا کنید.

در زیر محتوای پرونده فعالیت اصلی تغییر یافته 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 شما را اجرا کنیم. من تصور می کنم شما AVD خود را هنگام راه اندازی محیط ایجاد کرده اید. برای اجرای برنامه از Android studio، یکی از پرونده های فعالیت پروژه خود را باز کنید و از نوار ابزار روی Android StudioRun Icon کلیک کنید. Android Studio برنامه را روی AVD شما نصب کرده و شروع به کار می کند و اگر با تنظیمات و برنامه هایتان همه چیز خوب باشد، زیر پنجره شبیه ساز نمایش داده می شود.

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

منبع.

لیست جلسات قبل آموزش برنامه نویسی اندروید

  1. نگاهی کلی به برنامه نویسی اندروید
  2. تنظیمات محیط  در برنامه نویسی اندروید
  3. معماری برنامه نویسی اندروید
  4. اجزای برنامه در برنامه نویسی اندروید
  5. Hello World در برنامه نویسی اندروید
  6. سازماندهی و دسترسی به منابع در برنامه نویسی اندروید
  7. فعالیت در برنامه نویسی اندروید
  8. سرویس در برنامه نویسی اندروید
  9. گیرنده های پخش در برنامه نویسی اندروید
  10. ارائه دهنده محتوا در برنامه نویسی اندروید
  11. قطعات در برنامه نویسی اندروید
  12. Intent و فیلتر در برنامه نویسی اندروید
  13. طرح بندی رابط کاربری در برنامه نویسی اندروید
  14. کنترل های رابط کاربری در برنامه نویسی اندروید
  15. مدیریت رویدادها در برنامه نویسی اندروید
  16. استایل و تم ها در برنامه نویسی اندروید
  17. اجزای سفارشی در برنامه نویسی اندروید
  18. کشیدن و رها کردن در برنامه نویسی اندروید
  19. نوتیفیکیشن ها در برنامه نویسی اندروید
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه