2013-03-16 3 views
16

Ich bin auf Android 2.3.7 und ich versuche, einen BroadcastReceiver zu schreiben, der aufgerufen wird, wenn der Benutzer das GPS einschaltet/off (dh., indem sie in den Optionen auf den "Verwendung GPS-Satelliten" KlopfenAndroid: Erkennen, wenn GPS ein-/ausgeschaltet ist (oder wenn keine App mehr verwendet)

Was ich ist bisher getan habe dies:

1) die folgenden broadcastReceiver Erstellt:

public class GPSStatusBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     Toast.makeText(arg0, "Broadcast received!", Toast.LENGTH_SHORT).show(); 

    } 
} 

2) Fügte das zum Androidenmanifest innerhalb der Tags hinzu:

<receiver android:name=".GPSStatusBroadcastReceiver"> 
    <intent-filter> 
     <action android:name="android.location.PROVIDERS_CHANGED" /> 
    </intent-filter> 
</receiver> 

Jetzt ist das Problem damit, dass es nicht zuverlässig scheint. Wenn ich GPS ein-/ausschalte, läuft die onReceive() -Methode nur manchmal (ich würde sagen 1 Auszeit 3), die anderen Male wird es nicht aufgerufen.

Ich möchte wissen, ob es eine zuverlässige Möglichkeit gibt zu erkennen, wenn das GPS ein-/ausgeschaltet ist.

Wenn es nicht ist, wäre es nett, zumindest benachrichtigt zu werden, wenn keine App das GPS-anyer verwendet (dh wenn das GPS-Symbol aus der Statusleiste verschwindet und anzeigt, dass niemand aktiv aufzufinden ist).

EDIT: Klarstellung: Ich möchte dies nicht tun, während meine App läuft. Ich gerade was meine App zu starten, wenn GPS ein-/ausgeschaltet ist, tun Sie seine Sache und dann zu beenden, möchte ich nicht zu LocationsUpdates abonnieren ...

Antwort

9

auf API-Ebene 9 und höher können Sie verwenden LocationManager.PROVIDERS_CHANGED_ACTION:

Broadcast-Intent Aktion, wenn die konfigurierte Standortanbieter ändern. Zur Verwendung mit isProviderEnabled(String). Wenn Sie mit der LOCATION_MODE API interagieren, verwenden Sie stattdessen MODE_CHANGED_ACTION.

Konstanter Wert: "android.location.PROVIDERS_CHANGED"

Source

-3

Verwenden Sie eine LocationListener und überschreiben OnStatusChanged.

Sie können Ihren Listener mit der requestLocationUpdates(String, long, float, LocationListener)-Methode an Ihre LocationManager Instanz anhängen.

+1

Sorry, war meine Frage nicht klar genug. Ich möchte den Standort in meiner App nicht ermitteln. Was ich tun will, ist einfach zu erkennen, wenn das System vom Benutzer systemweit ein- und ausgeschaltet wird. (Meine App ist nur dieser Broadcast-Empfänger, der jedes Mal, wenn GPS ein-/ausgeschaltet wird, Daten auf die Festplatte schreibt) –

+0

@Master_T Ja, wenn 'OnStatusChanged' ausgelöst wird, wenn sich der Status geändert hat. Der Status ändert sich offensichtlich, wenn der Benutzer ihn aktiviert/deaktiviert. – poitroae

+0

Aber damit dies funktioniert, ist es nicht notwendig, dass meine App aktiv ist? Oder zumindest im Hintergrund laufen? Was ich will, ist, dass meine App angerufen wird, wann immer das GPS ein-/ausgeschaltet wird, sein Ding macht und dann beendet. Aus diesem Grund habe ich einen Broadcastreceiver verwendet, da er Apps benachrichtigt, selbst wenn sie nicht ausgeführt werden. –

3

Die folgende Lösung kann eine seltsame Lösung sein, aber Sie können es versuchen, wenn Sie keine Lösung finden. Ein weiteres Problem mit Ihrer Lösung ist es erst nach api Ebene 9.

in einem Thread oder Servicearbeiten können Sie den GPS-Status regelmäßig mit einem sehr kurzen Intervall überprüfen, indem

LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
boolean statusOfGPS = manager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

verwenden, wird sie die Erlaubnis verwenden

Auch wenn ich dies beantworte, sollte es für mich keine gute Lösung sein. Es besteht auch die Möglichkeit einer minimalen periodischen Verzögerung. Nur eine Option.

+0

Wie mit poitroae's Antwort: Wenn ich das benutze bedeutet das nicht, dass meine App läuft? Ich will das nicht. Ich möchte, dass meine App nur gestartet wird, wenn GPS ein-/ausgeschaltet ist, eine Methode ausführen und dann beenden. Ich hatte den Eindruck, dass Sie BroadcastReceivers dafür verwenden mussten, lag ich falsch? –

+0

Nein, Sie sind völlig richtig. Ich habe mich geirrt, als ich diesen Punkt bekommen habe. Mein Schlechter – stinepike

+1

Meine Schuld, meine Frage war etwas generisch, ich fügte die Klarstellung jetzt hinzu. –

2

ab API 19 Sie LocationManager.MODE_CHANGED_ACTION für die Absicht Aktion hören können.

Sie können auch den aktuellen Standort Modus erhalten wie folgt:

try 
{ 
    int locationMode = android.provider.Settings.Secure.getInt(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE); 
} catch (android.provider.Settings.SettingNotFoundException e) 
{ 
    e.printStackTrace(); 
} 

Der zurückgegebene Wert sollte einer von diesen sein:

android.provider.Settings.Secure.LOCATION_MODE_BATTERY_SAVING 
android.provider.Settings.Secure.LOCATION_MODE_HIGH_ACCURACY 
android.provider.Settings.Secure.LOCATION_MODE_OFF 
android.provider.Settings.Secure.LOCATION_MODE_SENSORS_ONLY 
Verwandte Themen