Sök…


Introduktion

Android Location API: er används i en mängd olika appar för olika ändamål, till exempel att hitta användarplats, meddela när en användare har lämnat ett allmänt område (Geofencing), och hjälper till att tolka användaraktivitet (promenader, löpning, körning osv.).

Men Android Location API: er är inte det enda sättet att skaffa användarplats. Följande kommer att ge exempel på hur du använder Android: s LocationManager och andra vanliga platsbibliotek.

Anmärkningar

För att bygga platsmedvetna appar i Android finns det två vägar:

LocationManager

Fördelar

  • Mer granulär kontroll
  • Finns i alla enheter
  • En del av Android-ramverket

Nackdelar

  • Batteriladdning är ett problem om det inte hanteras korrekt
  • Kräver logik för att byta platsleverantörer, om enheten inte kan hitta en plats (ex. Dålig GPS i en byggnad)

Funktioner

  • NMEA-lyssnare
  • GPS-statuslyssnare
  • Lyssna på leverantörsstatusändringar (ex. GPS stängs av av användaren)
  • Lista över leverantörer att välja platskälla från

providers

GPS

  • Behörigheter krävs:
  • Noggrannhet: 10 - 100 m
  • Strömkrav: HÖG
  • Tillgänglighet: över hela världen (med klar utsikt över himlen)
  • ANMÄRKNINGAR :
    • Platsuppdateringar kommer vanligtvis in en gång per sekund, men i situationer där GPS inte har använts på länge och A-GPS inte är tillgängligt, tar det flera minuter innan en plats tas emot.
    • I fall där tydlig utsikt över himlen hindras, GPS-punkter kommer inte att klustera särskilt bra (platspunkter "hoppa") och noggrannhet kan vara vilseledande i vissa områden på grund av " Urban Canyon " -effekten.

Nätverk

  • Behörigheter krävs:
  • Noggrannhet: 100 - 1000 m +
  • Strömkrav: LÅG - MEDIUM
  • Tillgänglighet: Inom räckvidden för celltorn eller wifi-signal
  • OBS:
    • Platsuppdateringar förekommer mindre ofta än GPS
    • Platsuppdateringar klusterar vanligtvis inte bra (platspunkter "hoppar") och noggrannhet kan variera beroende på antal olika faktorer (antal wifi-signaler, signalstyrka, typ av celltorn etc.)

Passiv

  • Behörigheter krävs:
  • Noggrannhet: 10 - 1000 m +
  • Strömkrav: INGEN
  • Tillgänglighet: Endast när en annan app får en plats från antingen GPS eller nätverk
  • OBS:
    • Lita inte på detta för att ge dig kontinuerliga uppdateringar. Detta lyssnar passivt på andra appar som gör begäran om plats och skickar tillbaka dessa platser.
    • Returnerar inte FusedLocationProviderApi-genererade poäng, bara de underliggande platspunkter som används för att generera dem.

FusedLocationProviderApi

Fördelar

  • Erbjuder mindre batteriladdning "ur lådan"
  • Hanterar dålig GPS bra
  • Få uppdateringar mer regelbundet

Nackdelar

  • Mindre granulär kontroll över GPS
  • Kanske inte tillgängligt på alla enheter eller i vissa länder
  • Kräver tredje parts bibliotekberoende

Funktioner

  • Välskött användning av platsleverantörer för optimal besparing av smet
  • Genererar vanligtvis mer exakta poäng än nätverksplatsleverantören
  • Mer frekventa uppdateringar av biblioteket, vilket möjliggör mer förbättring
  • Du behöver inte ange vilken typ av leverantör som ska användas

LocationRequest Prioritet Levels

PRIORITY_HIGH_ACCURACY

  • Behörigheter krävs:
  • Noggrannhet: 10 - 100 m
  • Strömkrav: HÖG
  • Tillgänglighet: Var Google Play-tjänster är tillgängliga.
  • OBS:
    • Om ACCESS_FINE_LOCATION inte används, kommer detta inte att använda GPS för att generera platsuppdateringar, men kommer fortfarande att hitta en ganska exakt punkt under rätt förhållanden.
    • Om ACCESS_FINE_LOCATION används kan den kanske eller inte använda GPS för att generera platspunkter, beroende på hur exakt den för närvarande kan spåra enheten med tanke på miljöförhållandena.
    • Även om detta kan rapportera mer exakta platsuppdateringar än de andra inställningarna, är det fortfarande benäget för " Urban Canyon " -effekten.

PRIORITY_BALANCED_POWER_ACCURACY

  • Behörigheter krävs:
  • Noggrannhet: 100 - 1000 m +
  • Strömkrav: MEDIUM
  • Tillgänglighet: Var Google Play-tjänster är tillgängliga.
  • OBS:
    • Samma anteckningar som PRIORITY_HIGH_ACCURACY
    • Även om det är osannolikt kan den här inställningen fortfarande använda GPS för att generera en plats.

PRIORITY_LOW_POWER

  • Behörigheter krävs:
  • Noggrannhet: 100 - 1000 m +
  • Strömkrav: LÅG
  • Tillgänglighet: Var Google Play-tjänster är tillgängliga.
  • OBS:
    • Använder förmodligen inte GPS, men hittills inte testat.
    • Uppdateringar är vanligtvis inte så exakta
    • Används generellt för att upptäcka betydande platsändringar

PRIORITY_NO_POWER

  • Behörigheter krävs:
  • Noggrannhet: 10 - 1000 m +
  • Strömkrav: INGEN
  • Tillgänglighet: Var Google Play-tjänster är tillgängliga.
  • OBS:
    • Funktioner nästan identiskt med LocationManager PASSIVE_PROVIDER
    • Rapporterar uppdateringarna av Google Play Services när de PASSIVE_PROVIDER emot, där PASSIVE_PROVIDER rapporterar bakomliggande platsuppdateringar som använts

Felsökning

OnLocationChanged () Har aldrig ringt

Eftersom detta verkar vara ett vanligt problem med att få Android-placeringar lägger jag ner en snabb checklista med vanliga korrigeringar:


  1. Kontrollera ditt manifest!

    En av de vanligaste frågorna är att rätt rättigheter aldrig gavs. Om du använder GPS (med eller utan nätverk), använd <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> , använd <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> . Googles FusedLocationApi kräver ACCESS_FINE_LOCATION .


  1. (För Android 6+) Kontrollera körtidstillstånd !

    Kontrollera och begär behörigheter! Om du aldrig får behörigheter, kommer du att hamna med kraschar, eller ännu värre (om du fångar alla undantag), kommer du att sluta med inga indikationer på någonting! Det spelar ingen roll om användaren ger dig tillåtelse i början av appen. Kontrollera alltid om du har behörighet för alla samtal. Användaren kan enkelt gå till sina inställningar och återkalla dem.


  1. Kontrollera din kod igen!

    Är du säker på att du passerar rätt lyssnare? Har du lagt till BroadcastReceiver eller IntentService till ditt manifest? PendingIntent.getService() du PendingIntent.getService() en BroadcastReceiver klass eller getBroadcast() en IntentService klass? Är du säker på att du inte avregistrerar din lyssnare någon annanstans i din kod omedelbart efter begäran?


  1. Kontrollera enhetsinställningar!

    Självklart, se till att platstjänster är aktiverade.

    ange bildbeskrivning här

    Om du använder Nätverkstjänster, aktiverade du "Skanning alltid tillgängligt"? Har du ditt lägesläge inställt på "Bäst" ("Hög noggrannhet") eller "Batterisparande" ("Endast nätverk")?

    ange bildbeskrivning här

    Om du använder GPS, aktiverade du "Bäst" ("Hög noggrannhet") eller "Enhet bara" i platsläge?

    ange bildbeskrivning här


  1. Kontrollera din kod igen!

    Ja, det här är här två gånger. Försökte du använda en LocationListener istället för en PendingIntent , eller tvärtom, för att säkerställa att du faktiskt implementerade LocationManager korrekt? Är du säker på att platsbegäran inte tas bort i någon del av aktivitets- eller tjänstens livscykel som du inte förväntade hända?


  1. Kontrollera din omgivning!

    Testar du GPS på första våningen i en byggnad mitt i San Francisco? Testar du nätverksplatser mitt i ingenstans? Arbetar du i en hemlig underjordisk bunker tom för alla radiosignaler och undrar varför din enhet inte får plats? Kontrollera alltid omgivningen när du försöker felsöka platsproblem!


Det kan finnas många andra mindre uppenbara orsaker till att platsen inte fungerar, men innan du söker igenom dessa esoteriska korrigeringar, kör bara igenom den här snabba checklistan.

API för smält plats

Exempel Använda aktivitet w / LocationRequest

/*
 * This example is useful if you only want to receive updates in this 
 * activity only, and have no use for location anywhere else.
 */
public class LocationActivity extends AppCompatActivity implements
        GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {

    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

        mLocationRequest = new LocationRequest()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) //GPS quality location points
                .setInterval(2000) //At least once every 2 seconds
                .setFastestInterval(1000); //At most once a second
    }

    @Override
    protected void onStart(){
        super.onStart();
        mGoogleApiClient.connect();
    }
    
    @Override
    protected void onResume(){
        super.onResume();
        //Permission check for Android 6.0+
        if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            if(mGoogleApiClient.isConnected()) {
                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
            }
        }
    }
    
    @Override
    protected void onPause(){
        super.onPause();
        //Permission check for Android 6.0+
        if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            if(mGoogleApiClient.isConnected()) {
                LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
            }
        }
    }
    
    @Override
    protected void onStop(){
        super.onStop();
        mGoogleApiClient.disconnect();
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {
        mGoogleApiClient.connect();
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    }

    @Override
    public void onLocationChanged(Location location) {
        //Handle your location update code here
    }
}

Exempel Användning av tjänst w / PendingIntent och BroadcastReceiver

ExampleActivity

Rekommenderad läsning: LocalBroadcastManager

/*
 * This example is useful if you have many different classes that should be 
 * receiving location updates, but want more granular control over which ones
 * listen to the updates.
 * 
 * For example, this activity will stop getting updates when it is not visible, but a database
 * class with a registered local receiver will continue to receive updates, until "stopUpdates()" is called here.
 *
 */
public class ExampleActivity extends AppCompatActivity {

    private InternalLocationReceiver mInternalLocationReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        
        //Create internal receiver object in this method only.
        mInternalLocationReceiver = new InternalLocationReceiver(this);
    }

    @Override
    protected void onResume(){
        super.onResume();
        
        //Register to receive updates in activity only when activity is visible
        LocalBroadcastManager.getInstance(this).registerReceiver(mInternalLocationReceiver, new IntentFilter("googleLocation"));
    }

    @Override
    protected void onPause(){
        super.onPause();
        
        //Unregister to stop receiving updates in activity when it is not visible.
        //NOTE: You will still receive updates even if this activity is killed.
        LocalBroadcastManager.getInstance(this).unregisterReceiver(mInternalLocationReceiver);
    }

    //Helper method to get updates
    private void requestUpdates(){
        startService(new Intent(this, LocationService.class).putExtra("request", true));
    }

    //Helper method to stop updates
    private void stopUpdates(){
        startService(new Intent(this, LocationService.class).putExtra("remove", true));
    }

    /*
     * Internal receiver used to get location updates for this activity.
     * 
     * This receiver and any receiver registered with LocalBroadcastManager does
     * not need to be registered in the Manifest.
     *
     */
    private static class InternalLocationReceiver extends BroadcastReceiver{

        private ExampleActivity mActivity;

        InternalLocationReceiver(ExampleActivity activity){
            mActivity = activity;
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            final ExampleActivity activity = mActivity;
            if(activity != null) {
                LocationResult result = intent.getParcelableExtra("result");
                //Handle location update here
            }
        }
    }
}

Plats-service

OBS: Glöm inte att registrera den här tjänsten i manifestet!

public class LocationService extends Service implements
        GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;

    @Override
    public void onCreate(){
        super.onCreate();
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

        mLocationRequest = new LocationRequest()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) //GPS quality location points
                .setInterval(2000) //At least once every 2 seconds
                .setFastestInterval(1000); //At most once a second
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId){
        super.onStartCommand(intent, flags, startId);
        //Permission check for Android 6.0+
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            if (intent.getBooleanExtra("request", false)) {
                if (mGoogleApiClient.isConnected()) {
                    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, getPendingIntent());
                } else {
                    mGoogleApiClient.connect();
                }
            }
            else if(intent.getBooleanExtra("remove", false)){
                stopSelf();
            }
        }

        return START_STICKY;
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        if(mGoogleApiClient.isConnected()){
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, getPendingIntent());
            mGoogleApiClient.disconnect();
        }
    }
    
    private PendingIntent getPendingIntent(){
        
        //Example for IntentService
        //return PendingIntent.getService(this, 0, new Intent(this, **YOUR_INTENT_SERVICE_CLASS_HERE**), PendingIntent.FLAG_UPDATE_CURRENT);
        
        //Example for BroadcastReceiver
        return PendingIntent.getBroadcast(this, 0, new Intent(this, LocationReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        //Permission check for Android 6.0+
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, getPendingIntent());
        }
    }

    @Override
    public void onConnectionSuspended(int i) {
        mGoogleApiClient.connect();
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

LocationReceiver

OBS: Glöm inte att registrera denna mottagare i manifestet!

public class LocationReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if(LocationResult.hasResult(intent)){
            LocationResult locationResult = LocationResult.extractResult(intent);
            LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("googleLocation").putExtra("result", locationResult));
        }
    }
}

Begär platsuppdateringar med LocationManager

Som alltid måste du se till att du har nödvändiga behörigheter.

public class MainActivity extends AppCompatActivity implements LocationListener{

    private LocationManager mLocationManager = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    }


    @Override
    protected void onResume() {
        super.onResume();

        try {
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        }
        catch(SecurityException e){
            // The app doesn't have the correct permissions
        }
    }


    @Override
    protected void onPause() {
        try{
            mLocationManager.removeUpdates(this);
        }
        catch (SecurityException e){
            // The app doesn't have the correct permissions
        }

        super.onPause();
    }




    @Override
    public void onLocationChanged(Location location) {
        // We received a location update!
        Log.i("onLocationChanged", location.toString());
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }
}

Begär platsuppdateringar på en separat tråd med LocationManager

Som alltid måste du se till att du har nödvändiga behörigheter.

public class MainActivity extends AppCompatActivity implements LocationListener{

    private LocationManager mLocationManager = null;
    HandlerThread mLocationHandlerThread = null;
    Looper mLocationHandlerLooper = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        mLocationHandlerThread = new HandlerThread("locationHandlerThread");
    }


    @Override
    protected void onResume() {
        super.onResume();

        mLocationHandlerThread.start();
        mLocationHandlerLooper = mLocationHandlerThread.getLooper();

        try {
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this, mLocationHandlerLooper);
        }
        catch(SecurityException e){
            // The app doesn't have the correct permissions
        }
    }


    @Override
    protected void onPause() {
        try{
            mLocationManager.removeUpdates(this);
        }
        catch (SecurityException e){
            // The app doesn't have the correct permissions
        }

        mLocationHandlerLooper = null;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2)
            mLocationHandlerThread.quitSafely();
        else
            mLocationHandlerThread.quit();

        mLocationHandlerThread = null;


        super.onPause();
    }




    @Override
    public void onLocationChanged(Location location) {
        // We received a location update on a separate thread!
        Log.i("onLocationChanged", location.toString());

        // You can verify which thread you're on by something like this:
        // Log.d("Which thread?", Thread.currentThread() == Looper.getMainLooper().getThread() ? "UI Thread" : "New thread");
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }
}

Registrera geofence

Jag har skapat GeoFenceObserversationService singleton klass.

GeoFenceObserversationService.java :

public class GeoFenceObserversationService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback<Status> {

    protected static final String TAG = "GeoFenceObserversationService";
    protected GoogleApiClient mGoogleApiClient;
    protected ArrayList<Geofence> mGeofenceList;
    private boolean mGeofencesAdded;
    private SharedPreferences mSharedPreferences;
    private static GeoFenceObserversationService mInstant;
    public static GeoFenceObserversationService getInstant(){
        return mInstant;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mInstant = this;
        mGeofenceList = new ArrayList<Geofence>();
        mSharedPreferences = getSharedPreferences(AppConstants.SHARED_PREFERENCES_NAME, MODE_PRIVATE);
        mGeofencesAdded = mSharedPreferences.getBoolean(AppConstants.GEOFENCES_ADDED_KEY, false);

        buildGoogleApiClient();
    }


    @Override
    public void onDestroy() {
        mGoogleApiClient.disconnect();
        super.onDestroy();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    protected void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
        mGoogleApiClient.connect();
    }

    @Override
    public void onConnected(Bundle connectionHint) {
    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
    }

    @Override
    public void onConnectionSuspended(int cause) {

    }

    private GeofencingRequest getGeofencingRequest() {

        GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
        builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
        builder.addGeofences(mGeofenceList);
        return builder.build();
    }


    public void addGeofences() {
            if (!mGoogleApiClient.isConnected()) {
                Toast.makeText(this, getString(R.string.not_connected), Toast.LENGTH_SHORT).show();
                return;
            }

        populateGeofenceList();
        if(!mGeofenceList.isEmpty()){
            try {
                LocationServices.GeofencingApi.addGeofences(mGoogleApiClient, getGeofencingRequest(), getGeofencePendingIntent()).setResultCallback(this);
            } catch (SecurityException securityException) {
                securityException.printStackTrace();
            }
        }

        }

    public void removeGeofences() {
        if (!mGoogleApiClient.isConnected()) {
            Toast.makeText(this, getString(R.string.not_connected), Toast.LENGTH_SHORT).show();
            return;
        }
        try {
            LocationServices.GeofencingApi.removeGeofences(mGoogleApiClient,getGeofencePendingIntent()).setResultCallback(this);
        } catch (SecurityException securityException) {
            securityException.printStackTrace();
        }
    }


    public void onResult(Status status) {

        if (status.isSuccess()) {
            mGeofencesAdded = !mGeofencesAdded;
            SharedPreferences.Editor editor = mSharedPreferences.edit();
            editor.putBoolean(AppConstants.GEOFENCES_ADDED_KEY, mGeofencesAdded);
            editor.apply();
        } else {
            String errorMessage = AppConstants.getErrorString(this,status.getStatusCode());
            Log.i("Geofence", errorMessage);
        }
    }

    private PendingIntent getGeofencePendingIntent() {
        Intent intent = new Intent(this, GeofenceTransitionsIntentService.class);
        return PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }

    private void populateGeofenceList() {
        mGeofenceList.clear();
        List<GeoFencingResponce> geoFenceList = getGeofencesList;
        if(geoFenceList!=null&&!geoFenceList.isEmpty()){
            for (GeoFencingResponce obj : geoFenceList){
                mGeofenceList.add(obj.getGeofence());
                Log.i(TAG,"Registered Geofences : " + obj.Id+"-"+obj.Name+"-"+obj.Lattitude+"-"+obj.Longitude);
            }
        }
    }
}

AppConstant :

   public static final String SHARED_PREFERENCES_NAME = PACKAGE_NAME + ".SHARED_PREFERENCES_NAME";
    public static final String GEOFENCES_ADDED_KEY = PACKAGE_NAME + ".GEOFENCES_ADDED_KEY";
    public static final String DETECTED_GEOFENCES = "detected_geofences";
    public static final String DETECTED_BEACONS = "detected_beacons";

    public static String getErrorString(Context context, int errorCode) {
        Resources mResources = context.getResources();
        switch (errorCode) {
            case GeofenceStatusCodes.GEOFENCE_NOT_AVAILABLE:
                return mResources.getString(R.string.geofence_not_available);
            case GeofenceStatusCodes.GEOFENCE_TOO_MANY_GEOFENCES:
                return mResources.getString(R.string.geofence_too_many_geofences);
            case GeofenceStatusCodes.GEOFENCE_TOO_MANY_PENDING_INTENTS:
                return mResources.getString(R.string.geofence_too_many_pending_intents);
            default:
                return mResources.getString(R.string.unknown_geofence_error);
        }
    }

Var jag började Service? Från applikationsklass

  • startService(new Intent(getApplicationContext(),GeoFenceObserversationService.class));

Hur registrerade jag Geofences?

  • GeoFenceObserversationService.getInstant().addGeofences();

Hämta adress från plats med Geocoder

När du fick Location objektet från FusedAPI kan du enkelt skaffa Address information från det objektet.

private Address getCountryInfo(Location location) {
    Address address = null;
    Geocoder geocoder = new Geocoder(getActivity(), Locale.getDefault());
    String errorMessage;
    List<Address> addresses = null;
    try {
        addresses = geocoder.getFromLocation(
                location.getLatitude(),
                location.getLongitude(),
                // In this sample, get just a single address.
                1);
    } catch (IOException ioException) {
        // Catch network or other I/O problems.
        errorMessage = "IOException>>" + ioException.getMessage();
    } catch (IllegalArgumentException illegalArgumentException) {
        // Catch invalid latitude or longitude values.
        errorMessage = "IllegalArgumentException>>" + illegalArgumentException.getMessage();
    }
    if (addresses != null && !addresses.isEmpty()) {
        address = addresses.get(0);
    }
    return country;
}

Få platsuppdateringar i en BroadcastReceiver

Skapa först en BroadcastReceiver-klass för att hantera de inkommande platsuppdateringarna:

public class LocationReceiver extends BroadcastReceiver implements Constants {

    @Override
     public void onReceive(Context context, Intent intent) {

        if (LocationResult.hasResult(intent)) {
            LocationResult locationResult = LocationResult.extractResult(intent);
            Location location = locationResult.getLastLocation();
            if (location != null) {
                // Do something with your location
            } else {
                Log.d(LocationReceiver.class.getSimpleName(), "*** location object is null ***");
            }
        }
    }
}

När du ansluter till GoogleApiClient i onConnected återuppringning:

@Override
public void onConnected(Bundle connectionHint) {
    Intent backgroundIntent = new Intent(this, LocationReceiver.class);
    mBackgroundPendingIntent = backgroundPendingIntent.getBroadcast(getApplicationContext(), LOCATION_REUEST_CODE, backgroundIntent, PendingIntent.FLAG_CANCEL_CURRENT);
    mFusedLocationProviderApi.requestLocationUpdates(mLocationClient, mLocationRequest, backgroundPendingIntent);
}

Glöm inte att ta bort platsuppdateringens avsikt i rätt livscykel-återuppringning:

@Override
public void onDestroy() {
    if (servicesAvailable && mLocationClient != null) {
        if (mLocationClient.isConnected()) {
            fusedLocationProviderApi.removeLocationUpdates(mLocationClient, backgroundPendingIntent);
            // Destroy the current location client
            mLocationClient = null;
        } else {
            mLocationClient.unregisterConnectionCallbacks(this);
            mLocationClient = null;
        }
    }
    super.onDestroy();
}


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow