Android - Konuma Dayalı Hizmetler

Android konum API'leri, temel konum teknolojisinin ayrıntılarına odaklanmanıza gerek kalmadan konuma duyarlı uygulamalar oluşturmanızı kolaylaştırır.

Bu, yardımıyla mümkün hale gelir Google Play services, otomatik konum izleme, coğrafi sınır belirleme ve etkinlik tanıma ile uygulamanıza konum farkındalığı eklemeyi kolaylaştırır.

Bu eğitim, geçerli konumu almak, periyodik konum güncellemelerini almak, adresleri aramak vb. İçin Uygulamanızda Konum Servislerini nasıl kullanacağınızı gösterir.

Konum Nesnesi

Locationnesne bir enlem, boylam, zaman damgası ve yön, yükseklik ve hız gibi diğer bilgilerden oluşabilen bir coğrafi konumu temsil eder. Konuma özgü bilgileri almak için Konum nesnesiyle kullanabileceğiniz aşağıdaki önemli yöntemler vardır:

Sr.No. Yöntem ve Açıklama
1

float distanceTo(Location dest)

Bu konumla verilen konum arasındaki yaklaşık mesafeyi metre cinsinden verir.

2

float getAccuracy()

Bu konumun tahmini doğruluğunu metre cinsinden alın.

3

double getAltitude()

Mümkünse rakımı deniz seviyesinden metre cinsinden öğrenin.

4

float getBearing()

Yönü derece cinsinden alın.

5

double getLatitude()

Enlemi derece cinsinden alın.

6

double getLongitude()

Boylamı derece cinsinden alın.

7

float getSpeed()

Mümkünse hızı zeminde metre / saniye cinsinden alın.

8

boolean hasAccuracy()

Bu konumun doğruluğu varsa doğrudur.

9

boolean hasAltitude()

Bu konumun rakımı varsa doğrudur.

10

boolean hasBearing()

Bu konumun bir yönü varsa doğrudur.

11

boolean hasSpeed()

Bu konumun hızı varsa doğrudur.

12

void reset()

Konumun içeriğini temizler.

13

void setAccuracy(float accuracy)

Bu konumun tahmini doğruluğunu ayarlayın, metre.

14

void setAltitude(double altitude)

Rakımı, deniz seviyesinden metre cinsinden ayarlayın.

15

void setBearing(float bearing)

Yönü derece cinsinden ayarlayın.

16

void setLatitude(double latitude)

Enlemi derece cinsinden ayarlayın.

17

void setLongitude(double longitude)

Boylamı derece cinsinden ayarlayın.

18

void setSpeed(float speed)

Hızı yere göre metre / saniye cinsinden ayarlayın.

19

String toString()

Bu nesnenin kısa, insan tarafından okunabilir bir açıklamasını içeren bir dize döndürür.

Mevcut Konumu Alın

Mevcut konumu almak için, bir konum istemcisi oluşturun. LocationClient nesneyi kullanarak Konum Hizmetlerine bağlayın connect() yöntem ve sonra çağırın getLastLocation()yöntem. Bu yöntem, en son konumu şu şekilde döndürür:Locationenlem ve boylam koordinatlarını ve yukarıda açıklanan diğer bilgileri içeren nesne. Aktivitenizde konum bazlı işlevselliğe sahip olmak için iki arayüz uygulamanız gerekecektir -

  • GooglePlayServicesClient.ConnectionCallbacks
  • GooglePlayServicesClient.OnConnectionFailedListener

Bu arabirimler, etkinlik sınıfınızda uygulamanız gereken aşağıdaki önemli geri arama yöntemlerini sağlar:

Sr.No. Geri Arama Yöntemleri ve Açıklama
1

abstract void onConnected(Bundle connectionHint)

Bu geri arama yöntemi, konum hizmeti konum istemcisine başarıyla bağlandığında çağrılır. Kullanacaksınconnect() konum istemcisine bağlanma yöntemi.

2

abstract void onDisconnected()

Bu geri arama yöntemi, istemcinin bağlantısı kesildiğinde çağrılır. Kullanacaksındisconnect() konum istemcisinden bağlantıyı kesme yöntemi.

3

abstract void onConnectionFailed(ConnectionResult result)

Bu geri arama yöntemi, istemciyi hizmete bağlarken bir hata olduğunda çağrılır.

Konum istemcisini şurada oluşturmalısınız: onCreate() aktivite sınıfınızın yöntemini seçin, sonra bağlayın onStart(), böylece Konum Servisleri etkinliğiniz tamamen görünür durumdayken mevcut konumunuzu korur. İstemcinin bağlantısını kesmelisiniz onStop()yöntemini kullanın, böylece uygulamanız görünür olmadığında Konum Servisleri mevcut konumu korumaz. Bu, pil gücünden büyük ölçüde tasarruf etmeye yardımcı olur.

Güncellenen Konumu Alın

Konum güncellemelerine sahip olmak istiyorsanız, yukarıda belirtilen arayüzlerin yanı sıra uygulamanız gerekecektir. LocationListenerarayüz de. Bu arabirim, etkinlik sınıfınızda uygulamanız gereken aşağıdaki geri çağrı yöntemini sağlar -

Sr.No. Geri Arama Yöntemi ve Açıklama
1

abstract void onLocationChanged(Location location)

Bu geri arama yöntemi, konum değiştiğinde LocationClient'ten bildirim almak için kullanılır.

Konum Hizmet Kalitesi

LocationRequest nesne, konum güncellemeleri için bir hizmet kalitesi (QoS) talep etmek için kullanılır. LocationClient. QoS'yi işlemek için kullanabileceğiniz aşağıdaki yararlı ayarlayıcı yöntemleri vardır. Android resmi belgelerinde kontrol edebileceğiniz eşdeğer alıcı yöntemleri vardır.

Sr.No. Yöntem ve Açıklama
1

setExpirationDuration(long millis)

Bu isteğin süresini milisaniye cinsinden ayarlayın.

2

setExpirationTime(long millis)

Önyüklemeden bu yana milisaniye cinsinden istek sona erme süresini ayarlayın.

3

setFastestInterval(long millis)

Konum güncellemeleri için en hızlı aralığı milisaniye cinsinden açıkça ayarlayın.

4

setInterval(long millis)

Etkin konum güncellemeleri için istenen aralığı milisaniye cinsinden ayarlayın.

5

setNumUpdates(int numUpdates)

Konum güncellemelerinin sayısını ayarlayın.

6

setPriority(int priority)

İsteğin önceliğini ayarlayın.

Şimdi, örneğin, uygulamanız yüksek doğrulukta konum istiyorsa, bir konum isteği oluşturmalıdır. setPriority(int) PRIORITY_HIGH_ACCURACY olarak ayarla ve setInterval(long)5 saniyeye. "Şehir" düzeyinde doğruluk istemek için daha büyük aralık ve / veya PRIORITY_LOW_POWER veya "blok" düzeyinde doğruluk için PRIORITY_BALANCED_POWER_ACCURACY gibi diğer öncelikleri de kullanabilirsiniz.

Aktiviteler, arka plana girerken (örneğin onPause ()) veya en azından isteği güç tüketimini azaltmak için daha geniş bir aralığa ve daha düşük kaliteye değiştirirken tüm konum isteğini kaldırmayı kesinlikle düşünmelidir.

Bir Konum Adresini Görüntüleme

Bir kez sahipsin Location nesne, kullanabilirsin Geocoder.getFromLocation()belirli bir enlem ve boylam için adres alma yöntemi. Bu yöntem eşzamanlıdır ve işini yapması uzun zaman alabilir, bu nedenle yöntemidoInBackground() yöntemi AsyncTask sınıf.

AsyncTask kullanılabilmesi için alt sınıflara ayrılması gerekir ve alt sınıf geçersiz kılar doInBackground(Params...) arka planda bir görevi gerçekleştirme yöntemi ve onPostExecute(Result)yöntemi, arka plan hesaplaması tamamlandıktan sonra ve sonucu görüntülemek için UI iş parçacığında çağrılır. AyncTask'ta mevcut olan önemli bir yöntem daha vardır.execute(Params... params), bu yöntem görevi belirtilen parametrelerle yürütür.

Misal

Aşağıdaki örnek, geçerli konumu ve eşdeğer adresleri vb. Almak için uygulamanızda Konum Hizmetlerini nasıl kullanacağınızı pratik olarak gösterir.

Bu örneği denemek için, en son Android işletim sistemi ile donatılmış gerçek bir Mobil cihaza ihtiyacınız olacak, aksi takdirde çalışmayabilecek emülatörle uğraşmanız gerekecektir.

Android Uygulaması Oluşturun

Adım Açıklama
1 Bir Android uygulaması oluşturmak için Android studio IDE'yi kullanacak ve bunu com.example.tutorialspoint7.myapplication paketi altında Tutorialspoint olarak adlandıracaksınız .
2 eklemek src / GPSTracker.java dosyası ve gerekli kodu ekleyin.
3 Src / MainActivity.java dosyasını değiştirin ve geçerli konumu ve eşdeğer adresini almak için aşağıda gösterildiği gibi gerekli kodu ekleyin.
4 Yer / adres göstermek için üç düğme ve iki metin görünümü içeren tüm GUI bileşenlerini eklemek için düzen XML dosyasını res / layout / activity_main.xml'yi değiştirin.
5 Değiştir res / değerler / strings.xml gerekli sabit değerler tanımlamak için
6 AndroidManifest.xml'yi aşağıda gösterildiği gibi değiştirin
7 Android öykünücüsünü başlatmak ve uygulamada yapılan değişikliklerin sonucunu doğrulamak için uygulamayı çalıştırın.

Aşağıda, değiştirilen ana aktivite dosyasının içeriği yer almaktadır 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();
            }

         }
      });
   }
}

Aşağıda, değiştirilen ana aktivite dosyasının içeriği yer almaktadır 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;
   }
}

Aşağıdakilerin içeriği olacak res/layout/activity_main.xml dosya -

<?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>

Aşağıdakilerin içeriği olacak res/values/strings.xml iki yeni sabit tanımlamak için -

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

Aşağıdaki varsayılan içeriktir 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>

Hadi çalıştırmayı deneyelim Tutorialspointuygulama. Gerçek Android Mobil cihazınızı bilgisayarınıza bağladığınızı varsayıyorum. Uygulamayı Android Studio'dan çalıştırmak için, projenizin etkinlik dosyalarından birini açın

ve araç çubuğundan Çalıştır simgesini tıklayın . Uygulamanızı başlatmadan önce, Android stüdyo yükleyici, Android uygulamanızı çalıştırmak istediğiniz bir seçeneği seçmek için aşağıdaki pencereyi görüntüleyecektir.

Şimdi konumu görmek için aşağıdaki gibi konum bilgilerini görüntüleyecek Konum Al Düğmesini seçin -