2016-04-13 9 views
0

バックグラウンドで数分ごとにユーザーの場所を更新したいと思います。
Iこのサンプルコードgooglesamples/android-play-location
を使用するが、それはService
バックグラウンドで場所を更新してLocationSettingsを確認

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

の使用に変更するが、この方法は、Activity

を必要とするので、私は位置設定

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; 
     } 
    } 

を確認することができません

status.startResolutionForResult(MainActivity.this、 REQUEST_CHECK_SETTINGS);

と私はMainActvityで前のコードを置けば、私はmGoogleApiClientとmLocationSettingsRequest

LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient、 mLocationSettingsRequest)への参照を持っていないでしょう。

アクティビティが破棄されても、アップグレードしてバックグラウンドで保存したいと考えています。
これを行う正しい方法はサービスを使用することですか?
場所の設定を確認するにはどうすればよいですか?

[EDIT]
私はこの方法は、アプリがあっても、位置更新を受信するための より具体的には、バックグラウンドのユースケースに適しているPendingIntentIntentService

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

を使用しようとしましたシステム によって殺されました。

ServiceLocationListnerのバージョンとの違いは何ですか?

答えて

0

場所変更リスナーを使用することができます私は私の問題の解決策を見つけました。
は、私が法

MainActivity.getInstance()

MainActivityを使用し、メインのアクティビティにアクセスするには

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; 
     } 
    } 
} 

サービス

@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

あなたは[SOLUTION]

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を使用し、FusedLocationAPIはうまく機能します。私の問題は、checkLocationSettingsです。 –

関連する問題