web-dev-qa-db-ja.com

FusedLocationProviderClientはいつ、どのようにLooperを停止しますか?

FusedLocationApiは、廃止予定であることがわかるまで使用していました(以下の参考資料を参照)。実装は簡単でした。ドキュメントに記載されているように、GoogleApiClientと組み合わせて使用​​する必要があります

LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,
                        locationRequest, this);

私は最近FusedLocationProviderClientに変更しました(以下の参照を参照)チュートリアルに従って、FusedLocationProviderClientを正常に動作させることができました

チュートリアル: https://github.com/codepath/Android_guides/wiki/Retrieving-Location-with-LocationServices-API

// new Google API SDK v11 uses getFusedLocationProviderClient(this)
getFusedLocationProviderClient(this).requestLocationUpdates(mLocationRequest, new LocationCallback() {
      @Override
      public void onLocationResult(LocationResult locationResult) {
         // do work here
         onLocationChanged(locationResult.getLastLocation();
      }
    },
    Looper.myLooper());

私が遭遇している問題は、ルーパースレッドです。アプリケーションがバックグラウンドにある場合でも、ルーパースレッドは実行を続けます。アプリケーションがバックグラウンドにあるときに位置情報の更新を一時停止し、アプリケーションがフォアグラウンドにあるときに位置情報の更新を再開したい。どうすればこれを達成できますか?

参照:

  1. https://developers.google.com/Android/reference/com/google/Android/gms/location/FusedLocationProviderApi
  2. https://developers.google.com/Android/reference/com/google/Android/gms/location/FusedLocationProviderClient
10

場所を取得したら、単に削除してくださいmFusedLocationClient.removeLocationUpdates彼が上記の回答で述べたように。

if (mFusedLocationClient != null) 
        mFusedLocationClient.removeLocationUpdates(mLocationCallback);

ルーパーは、削除するまでrequestLocationUpdatesと呼ばれます。

私の問題では、上で述べたように行いました。以下は私のコードです。

  mFusedLocationClient.getLastLocation()
                    .addOnSuccessListener(new OnSuccessListener<Location>() {
                        @Override
                        public void onSuccess(Location location) {
                            // GPS location can be null if GPS is switched off
                            if (location != null) {

                                mLocation = location;

                                if (mFusedLocationClient != null) {
                                    mFusedLocationClient.removeLocationUpdates(mLocationCallback);
                                }
                          } else {
                                startLocationUpdates();
                           }
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(HomeActivity.this, "Error trying to get last GPS location", Toast.LENGTH_SHORT).show();
                            e.printStackTrace();
                        }
                    });

以下は私のrequestLocationUpdatesなので、場所が利用可能になるまでリクエストを受け取ります。

private void startLocationUpdates() {
        mSettingsClient.checkLocationSettings(mLocationSettingsRequest)
                .addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
                    @Override
                    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
                        Log.i(TAG, "All location settings are satisfied.");

                        getPackageManager().checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, getPackageName());
                        mFusedLocationClient.requestLocationUpdates(mLocationRequest,
                                mLocationCallback, Looper.myLooper());
                        getLastLocationNewMethod();
                    }
                })
                .addOnFailureListener(this, new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        int statusCode = ((ApiException) e).getStatusCode();
                        switch (statusCode) {
                            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                                Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " +
                                        "location settings ");
                                try {
                                    ResolvableApiException rae = (ResolvableApiException) e;
                                    rae.startResolutionForResult(HomeActivity.this, 0x1);
                                } catch (IntentSender.SendIntentException sie) {
                                    Log.i(TAG, "PendingIntent unable to execute request.");
                                }
                                break;
                            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                                String errorMessage = "Location settings are inadequate, and cannot be " +
                                        "fixed here. Fix in Settings.";
                                Log.e(TAG, errorMessage);
                                Toast.makeText(HomeActivity.this, errorMessage, Toast.LENGTH_LONG).show();
                                //  mRequestingLocationUpdates = false;
                        }
                        getLastLocationNewMethod();  // this method is where I can get location. It is calling above method. 
                    }
                });
    }

注:詳細については、GitHub Repo[〜#〜] link [〜#〜] をご覧ください

0
sushildlh