0

Ich entwickle eine App, in der das GPS eingeschaltet werden muss, um den aktuellen Standort des Benutzers abzurufen.Wie überprüfe/bestätige ich, ob GPS vom Benutzer eingeschaltet wurde?

ich diesen Code bin mit dem aktuellen Status von GPS zu überprüfen:

isGPSEnabled = locationManager 
       .isProviderEnabled(LocationManager.GPS_PROVIDER); 

und dann bin ich Umsetzung dieser weiteren Code:

if (!isGPSEnabled) { 
        // ask to turn on GPS 
        Snackbar snackbar = Snackbar 
            .make(coordinatorLayout, "No location detected!", Snackbar.LENGTH_LONG) 
            .setAction("RETRY", new View.OnClickListener() { 
             @Override 
             public void onClick(View view) { 
              Toast.makeText(getBaseContext(), "first called", Toast.LENGTH_SHORT).show(); 
              // same codes gets executed i.e. to check if user enabled GPS or not 
             } 
            }); 
          snackbar.setDuration(Snackbar.LENGTH_INDEFINITE); 
          snackbar.show(); 
       } else { 
        // execute necessary code 
       } 

Above Code genau prüft den Status GPS, aber wenn ich das GPS wieder einschalte und auf die Schaltfläche 'RETRY' von Snackbar klicke, wird der Code, der ausgeführt werden sollte, wenn GPS eingeschaltet ist, nicht ausgeführt, aber der Code, der ausgeführt werden sollte, wenn GPS ausgeschaltet ist wird ausgeführt.

Benötige ich irgendeine Art von Empfänger oder irgendetwas, um zu bestätigen, dass der Benutzer das GPS eingeschaltet hat, nachdem ich ihn darum gebeten habe?

Bitte lassen Sie es mich wissen.

Antwort

0

Ich sehe keine if Anweisung in der onClick-Methode, so dass es ausgeführt wird, was in dieser Methode ist, egal ob der Benutzer das GPS aktiviert oder nicht.

Wenn es Ihnen nichts ausmacht, dem Benutzer die Snackbar zu zeigen, können Sie auch die Änderungen des Standortanbieters mit einem Broadcast-Empfänger abhören.

Auf Ihren Aktivitäten onCreate Methode:

mLocationProviderChangedReceiver = new LocalLocationProviderChangedReceiver(this); 
registerReceiver(mLocationProviderChangedReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION)); 

Auf Ihrer onDestroy Methode der Aktivität:

if (mLocationProviderChangedReceiver != null) { 
    unregisterReceiver(mLocationProviderChangedReceiver); 
    mLocationProviderChangedReceiver = null; 
} 

eine statische innere Klasse erstellen:

private static class LocalLocationProviderChangedReceiver extends BroadcastReceiver { 

    private final WeakReference<MyActivity> mWeakActivity; 

    public LocalLocationProviderChangedReceiver(@NonNull MyActivity activity) { 
     mWeakActivity = new WeakReference<>(activity); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     MyActivity activity = mWeakActivity.get(); 
     if (activity != null) { 
      activity.refresh(); 
     } 
    } 

} 

Eine Refresh Methode in Ihrer Aktivität:

public void refresh() { 
    final LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
    boolean isGpsEnabled = manager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
    if (isGpsEnabled) { 
     // TODO: Do what you need to do with the GPS 
    } else { 
     // TODO: e.g. Show a textview displaying a warning, maybe you could start the intent to activate the Location: 
     // Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
     // startActivity(i); 
    } 
} 
+0

Was ist 'LocalLocationProviderChangedReceiver'? –

+0

Die statische innere Klasse, die den BroadcastReceiver – fernandospr

+0

erweitert und was ist 'NotificationsConfigurationActivity' und' MyActivity'? –