2016-04-13 49 views
0

Kullanıcıların konumunu her birkaç dakikada bir arka planda güncellemek istiyorum.
Ben Service
Arka planda konumu güncelleyin ve LocationSettings'i denetleyin

public class MyService extends Service implements 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, 
     LocationListener, ResultCallback<LocationSettingsResult> 

ile kullanmak için bu örnek kod googlesamples/android-play-location
ama bunu değiştirmesini kullanılan ancak bu yöntem bir Activity

gerektirdiğinden ben konum ayarlarının

protected void checkLocationSettings() { 
     PendingResult<LocationSettingsResult> result = 
       LocationServices.SettingsApi.checkLocationSettings(
         mGoogleApiClient, 
         mLocationSettingsRequest 
       ); 
     result.setResultCallback(this); 
    } 

    @Override 
    public void onResult(LocationSettingsResult locationSettingsResult) { 
     final Status status = locationSettingsResult.getStatus(); 
     switch (status.getStatusCode()) { 
      case LocationSettingsStatusCodes.SUCCESS: 
       Log.i(TAG, "All location settings are satisfied."); 
       startLocationUpdates(); 
       break; 
      case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
       Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to" + 
         "upgrade location settings "); 

       try { 
        // Show the dialog by calling startResolutionForResult(), and check the result 
        // in onActivityResult(). 
        status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS); 
       } catch (IntentSender.SendIntentException e) { 
        Log.i(TAG, "PendingIntent unable to execute request."); 
       } 
       break; 
      case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
       Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog " + 
         "not created."); 
       break; 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 
      // Check for the integer request code originally supplied to startResolutionForResult(). 
      case REQUEST_CHECK_SETTINGS: 
       switch (resultCode) { 
        case Activity.RESULT_OK: 
         Log.i(TAG, "User agreed to make required location settings changes."); 
         startLocationUpdates(); 
         break; 
        case Activity.RESULT_CANCELED: 
         Log.i(TAG, "User chose not to make required location settings changes."); 
         break; 
       } 
       break; 
     } 
    } 

kontrol edemez

status.startResolutionForResult (MainActivity.this, REQUEST_CHECK_SETTINGS);

ve MainActvity önceki kod koymak, ben mGoogleApiClient ve mLocationSettingsRequest

LocationServices.SettingsApi.checkLocationSettings (mGoogleApiClient, mLocationSettingsRequest) referanslar değildir;

Etkinlik yok olsa bile arka planı yükseltmek ve kaydetmek isterim.
Hizmeti kullanmanın doğru yolu bu mu?
Konum ayarlarını nasıl kontrol ederim?

[DÜZ]
I PendingIntent kullanmak güvenilir ve uygulama olsa bile, bir IntentService

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, 
        mLocationRequest, mPendingIntent); 

Bu yöntem, daha özel olarak konum güncellemeleri alınması için, arka plan kullanım durumları için uygundur, Sistem tarafından öldürüldü.

fark Service ve LocationListner ile sürümüne göre nedir?

cevap

0

[ÇÖZÜM]
benim sorun için bir çözüm buldular.
Ben yöntemini

MainActivity.getInstance()

MainActivity kullanılan Ana Aktivite erişmek için

public class MainActivity extends AppCompatActivity { 
    private static MainActivity instance; 

    public static MainActivity getInstance() { 
     Log.i("MainActivity", "getInstance"); 
     return instance; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     Log.i(TAG, "onCreate"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Instance of the MainActivity 
     instance = this; 
    } 
    ... 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.i(TAG, "onActivityResult"); 
    switch (requestCode) { 
     // Check for the integer request code originally supplied to startResolutionForResult(). 
     case REQUEST_CHECK_SETTINGS: 
      switch (resultCode) { 
       case Activity.RESULT_OK: 
        Log.i(TAG, "User agreed to make required location settings changes."); 
        startService(intent); 
        break; 
       case Activity.RESULT_CANCELED: 
        Log.i(TAG, "User chose not to make required location settings changes."); 
        break; 
      } 
      break; 
     } 
    } 
} 

Servis

@Override 
public void onResult(LocationSettingsResult locationSettingsResult) { 
    final Status status = locationSettingsResult.getStatus(); 
    switch (status.getStatusCode()) { 
     case LocationSettingsStatusCodes.SUCCESS: 
      // All location settings are satisfied. The client can 
      // initialize location requests here. 
      Log.i(TAG, "All location settings are satisfied."); 
      startLocationUpdates(); 
      break; 
     case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
      // Location settings are not satisfied, but this can be fixed 
      // by showing the user a dialog. 
      Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to " + 
        "upgrade location settings "); 
      try { 
       // Show the dialog by calling startResolutionForResult(), 
       // and check the result in onActivityResult(). 
       status.startResolutionForResult(MainActivity.getInstance(), REQUEST_CHECK_SETTINGS); 
      } catch (IntentSender.SendIntentException e) { 
       // Ignore the error. 
       Log.i(TAG, "PendingIntent unable to execute request."); 
      } 
      break; 
     // The status will never be SETTINGS_CHANGE_UNAVAILABLE if use builder.setAlwaysShow(true); 
     case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
      // Location settings are not satisfied. However, we have no way 
      // to fix the settings so we won't show the dialog. 
      Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog " + 
        "not created."); 
      break; 
    } 
} 
0

Yer değiştirme dinleyici kullanabilirsiniz

public class LocationService extends Service 
    { 
      public static final String BROADCAST_ACTION = "Hello World"; 
      private static final int TWO_MINUTES = 1000 * 60 * 2; 
      public LocationManager locationManager; 
      public MyLocationListener listener; 
      public Location previousBestLocation = null; 

      Intent intent; 
      int counter = 0; 

     @Override 
     public void onCreate() 
     { 
      super.onCreate(); 
      intent = new Intent(BROADCAST_ACTION);  
     } 

     @Override 
     public void onStart(Intent intent, int startId) 
     {  
      locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
      listener = new MyLocationListener();   
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 4000, 0, listener); 
      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 4000, 0, listener); 
     } 

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

     protected boolean isBetterLocation(Location location, Location currentBestLocation) { 
      if (currentBestLocation == null) { 
       // A new location is always better than no location 
       return true; 
      } 

      // Check whether the new location fix is newer or older 
      long timeDelta = location.getTime() - currentBestLocation.getTime(); 
      boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; 
      boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; 
      boolean isNewer = timeDelta > 0; 

      // If it's been more than two minutes since the current location, use the new location 
      // because the user has likely moved 
      if (isSignificantlyNewer) { 
       return true; 
      // If the new location is more than two minutes older, it must be worse 
      } else if (isSignificantlyOlder) { 
       return false; 
      } 

      // Check whether the new location fix is more or less accurate 
      int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy()); 
      boolean isLessAccurate = accuracyDelta > 0; 
      boolean isMoreAccurate = accuracyDelta < 0; 
      boolean isSignificantlyLessAccurate = accuracyDelta > 200; 

      // Check if the old and new location are from the same provider 
      boolean isFromSameProvider = isSameProvider(location.getProvider(), 
        currentBestLocation.getProvider()); 

      // Determine location quality using a combination of timeliness and accuracy 
      if (isMoreAccurate) { 
       return true; 
      } else if (isNewer && !isLessAccurate) { 
       return true; 
      } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { 
       return true; 
      } 
      return false; 
     } 



    /** Checks whether two providers are the same */ 
     private boolean isSameProvider(String provider1, String provider2) { 
      if (provider1 == null) { 
       return provider2 == null; 
      } 
      return provider1.equals(provider2); 
     } 



    @Override 
     public void onDestroy() {  
      // handler.removeCallbacks(sendUpdatesToUI);  
      super.onDestroy(); 
      Log.v("STOP_SERVICE", "DONE"); 
      locationManager.removeUpdates(listener);   
     } 

     public static Thread performOnBackgroundThread(final Runnable runnable) { 
      final Thread t = new Thread() { 
       @Override 
       public void run() { 
        try { 
         runnable.run(); 
        } finally { 

        } 
       } 
      }; 
      t.start(); 
      return t; 
     } 




    public class MyLocationListener implements LocationListener 
     { 

      public void onLocationChanged(final Location loc) 
      { 
       Log.i("**************************************", "Location changed"); 
       if(isBetterLocation(loc, previousBestLocation)) { 
        loc.getLatitude(); 
        loc.getLongitude();    
        intent.putExtra("Latitude", loc.getLatitude()); 
        intent.putExtra("Longitude", loc.getLongitude());  
        intent.putExtra("Provider", loc.getProvider());     
        sendBroadcast(intent);   

       }        
      } 

      public void onProviderDisabled(String provider) 
      { 
       Toast.makeText(getApplicationContext(), "Gps Disabled", Toast.LENGTH_SHORT).show(); 
      } 


      public void onProviderEnabled(String provider) 
      { 
       Toast.makeText(getApplicationContext(), "Gps Enabled", Toast.LENGTH_SHORT).show(); 
      } 


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

      } 

     } 
    } 
+0

LocationListener'ı kullandım ve FusedLocationAPI çok iyi çalışıyor.Sorunum checkLocationSettings ile. –

İlgili konular