2016-05-09 2 views
0

Я искал дни и дни, и почему-то ответ на вопрос, почему onLocationChanged не вызван, ускользнул от меня. Я внимательно прочитал документацию, и я ДОЛЖЕН пропустить что-то важное. Я просто хочу, чтобы служба работала в фоновом режиме, когда местоположение изменилось, я хочу зарегистрировать местоположение.Использование LocationServices.FusedLocationApi.requestLocationUpdates в фоновой службе Android ... onLocationChanged никогда не вызывал

Вот моя служба ...

import android.app.PendingIntent; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.location.Location; 
import android.os.Binder; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.PowerManager; 
import android.support.annotation.Nullable; 
import android.util.Log; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GoogleApiAvailability; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 

public class BackgroundLocationService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 
    private final String TAG = ((Object) this).getClass().getSimpleName(); 

    IBinder mBinder = new LocalBinder(); 

    GoogleApiAvailability googleAPI; 
    PowerManager.WakeLock mWakeLock; 
    private boolean mInProgress; 
    private Boolean servicesAvailable = false; 

    protected GoogleApiClient mGoogleApiClient; 
    protected LocationRequest mLocationRequest; 
    private Intent mIntentService; 
    private PendingIntent mPendingIntent; 

    public class LocalBinder extends Binder { 
     public BackgroundLocationService getServerInstance() { 
      return BackgroundLocationService.this; 
     } 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     googleAPI = GoogleApiAvailability.getInstance(); 
     mInProgress = false; 

     mIntentService = new Intent(this,BackgroundLocationService.class); 
     mPendingIntent = PendingIntent.getService(this, 1, mIntentService, PendingIntent.FLAG_UPDATE_CURRENT); 

     servicesAvailable = servicesConnected(); 

     /* 
     * Create a new google api client, using the enclosing class to handle callbacks. 
     */ 
     buildGoogleApiClient(); 
    } 

    private boolean servicesConnected() { 

     // Check that Google Play services is available 
     int resultCode = googleAPI.isGooglePlayServicesAvailable(this); 

     // If Google Play services is available 
     if (ConnectionResult.SUCCESS == resultCode) { 

      return true; 
     } else { 

      return false; 
     } 
    } 

    protected void startLocationUpdates() { 
     Log.i(TAG, "Started Location Updates"); 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mPendingIntent); 
    } 

    protected void stopLocationUpdates() { 
     Log.i(TAG,"Stopped Location Updates"); 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mPendingIntent); 
    } 

    protected void createLocationRequest() { 
     Log.i(TAG, "createLocationRequest()"); 
     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(5000); 
     mLocationRequest.setFastestInterval(1000); 
     //mLocationRequest.setMaxWaitTime(10000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    } 

    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
     PowerManager mgr = (PowerManager) getSystemService(Context.POWER_SERVICE); //*** added this 

     if (this.mWakeLock == null) { 
      mWakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "aWakeLock"); //*** added this 
     } 

     if (!this.mWakeLock.isHeld()) { 
      mWakeLock.acquire(); //*** added this 
     } 

     if (!servicesAvailable || mGoogleApiClient.isConnected() || mInProgress) 
      return START_STICKY; 

     if (!mGoogleApiClient.isConnected() || !mGoogleApiClient.isConnecting() && !mInProgress) { 
      Log.e(TAG, "Location Client not connected, connecting..."); 
      mInProgress = true; 
      mGoogleApiClient.connect(); 
     } 

     Log.e(TAG, "Location Client: onStartCommand"); 
     return START_STICKY; 
    } 

    protected synchronized void buildGoogleApiClient() { 
     Log.i(TAG, "Building GoogleApiClient"); 
     if (mGoogleApiClient == null) { 
      this.mGoogleApiClient = new GoogleApiClient.Builder(this) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .addApi(LocationServices.API) 
        .build(); 
     } 
     createLocationRequest(); 
    } 

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

    @Override 
    public void onDestroy() { 
     // Turn off the request flag 
     this.mInProgress = false; 

     if (this.mWakeLock != null) { 
      this.mWakeLock.release(); 
      this.mWakeLock = null; 
     } 

     Log.e(TAG, "Location Client: ON DESTROY"); 
     super.onDestroy(); 
     stopLocationUpdates(); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 

     startLocationUpdates(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     Log.e(TAG, "Location Receiver [Location Changed]: " + location.getLatitude() + ", " + location.getLongitude()); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     Log.e(TAG, "Location Client: ON CONNECTED"); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     mInProgress = false; 

     Log.e(TAG, "Location Client: ON CONNECTION FAILED"); 
     if (connectionResult.hasResolution()) { 

      // If no resolution is available, display an error dialog 
     } else { 

     } 
    } 
} 

Я начал службу, как это ...

Intent BackgroundLocationService = new Intent(this, BackgroundLocationService.class); 
      startService(BackgroundLocationService); 

У меня есть следующие разрешения в манифесте, а также ...

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
+0

Вы никогда не устанавливали слушателей, которые вы внедрили. –

+0

Пожалуйста, объясните, насколько я знаю, я внедрил всех необходимых слушателей. – Kit

+0

Где вы можете найти решение этой проблемы? @Kit –

ответ

1

В запросеLocationUpdates используется ожидающий ответ текущий запрос, который запускается, чтобы снова запустить службу. Это не вызов обратного вызова OnLocationchanged. Попробуйте использовать requestLocationUpdates с приемником местоположения (3-й параметр). Он должен вызывать OnLocationchanged.

+0

Это действительно срабатывает onLocationChanged, но кажется, что мне нужно использовать PendingIntent, чтобы убедиться, что моя служба продолжает работать, когда приложение находится в фоновом режиме. Проверьте это: https://uncorkedstudios.com/blog/background-location-updates-on-android ... при этом я попробовал зарегистрировать широковещательный приемник в манифесте вместе с его реализацией точно так же, как ссылка Я сказал, что сказал ... но я не получаю никаких изменений в изменении местоположения (и да, место меняется). – Kit

+0

Если вы реализуете службу START_STICKY, тогда ОС Android перезагрузит службу, если она когда-либо прекратится из-за низкой памяти. Поэтому убедитесь, что в резюме, requestLocationUpdates начинается снова. Не беспокойтесь о ожидающем намерения (используйте случай в разных сценариях). Вы можете поддержать мой ответ, если все в порядке. – user1930106

+0

Вы не ответили на вопрос. Слушатели запускаются при использовании идентификаторов мест, и они предназначены для того, когда вашему приложению требуется обновление местоположения на переднем плане. Pendingintent используются, когда вы хотите получать обновления, пока ваше приложение также находится в фоновом режиме. [android documentation] ('https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderApi.html#requestLocationUpdates (com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.location.LocationRequest, android.app.PendingIntent) ') –

Смежные вопросы