2013-03-16 10 views
16

Jestem na systemie Android 2.3.7 i staram się napisać BroadcastReceiver, który zostanie wywołany, gdy użytkownik włącza GPS/off (tj. przez dotknięcie "Użyj satelitów GPS" w opcjachAndroid: wykrywanie, kiedy GPS jest włączony/wyłączony (lub gdy żadna aplikacja już go nie używa)

Co zrobiłem do tej pory to:

1) Utworzono następujące broadcastReceiver:

public class GPSStatusBroadcastReceiver extends BroadcastReceiver { 

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

    } 
} 

2) Dodano to do manifestu systemu Android, wewnątrz tagów:

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

Problem polega na tym, że wydaje się nie być niezawodny. Kiedy włączam GPS on/ff, metoda onReceive() działa tylko czasami (powiedziałbym 1 raz na 3), gdy nie jest wywoływana.

Chcę wiedzieć, czy istnieje niezawodny sposób wykrywania, kiedy GPS jest wyłączony/włączony.

Jeśli nie, dobrze byłoby być powiadamianym przynajmniej wtedy, gdy żadna aplikacja nie korzysta z GPS anymoer (np. Gdy ikona GPS znika z paska stanu, wskazując, że nikt nie aktywnie lokalizuje).

EDYCJA: Wyjaśnienie: Nie chcę tego robić, gdy moja aplikacja jest uruchomiona. Po prostu włączam i wyłączam moją aplikację, gdy gps jest włączony/wyłączony, wykonaj jego czynności, a następnie zakończ, nie chcę subskrybować lokalizacji. Aktualizacje ...

Odpowiedz

9

Na poziomie API 9 i wyższe można użyć LocationManager.PROVIDERS_CHANGED_ACTION:

Broadcast intencja działania, gdy skonfigurowany zmiana dostawcy lokalizacja. Do użytku z isProviderEnabled(String). Jeśli korzystasz z interfejsu LOCATION_MODE API, użyj zamiast tego opcji MODE_CHANGED_ACTION.

Stała wartość: "android.location.PROVIDERS_CHANGED"

Source

-3

Użyj numeru LocationListener i zmień OnStatusChanged.

Możesz dołączyć słuchacza za pomocą metody requestLocationUpdates(String, long, float, LocationListener) do instancji LocationManager.

+1

Niestety, moje pytanie nie było wystarczająco jasne. Nie chcę wykrywać lokalizacji w mojej aplikacji. Chcę tylko wykryć, kiedy system GPS jest włączony/wyłączony przez system użytkownika. (Moja aplikacja będzie tylko tym odbiornikiem, który po prostu zapisze dane na dysku za każdym razem, gdy GPS zostanie włączony/wyłączony) –

+0

@Master_T tak, jeśli 'OnStatusChanged' jest wyzwalane, jeśli status się zmienił. Status oczywiście zmienia się, gdy użytkownik włącza/wyłącza go. – poitroae

+0

Ale czy to działa, czy moja aplikacja nie jest aktywna? A przynajmniej działa w tle? Chcę, aby moja aplikacja była wywoływana za każdym razem, gdy GPS jest włączony/wyłączony, zrób to, a następnie zakończ. Właśnie dlatego używałem BroadcasReceiver, ponieważ powiadamia aplikacje, nawet jeśli nie są uruchomione. –

3

Poniższe rozwiązanie może być dziwnym rozwiązaniem, ale możesz go wypróbować, jeśli nie znajdziesz żadnego rozwiązania. Kolejny problem z rozwiązania jest to, że działa tylko po poziomie api 9.

w wątku lub usługi można sprawdzić status GPS okresowo w bardzo krótkim odstępie czasu za pomocą

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

użyje pozwolenie

android.permission.ACCESS_FINE_LOCATION 

Mimo, że odpowiadam na to, dla mnie nie powinno to być dobrym rozwiązaniem. Istnieje również szansa na minimalne opóźnienie interwału. Tylko opcja.

+0

Podobnie jak w przypadku odpowiedzi poitroae: jeśli użyję tego, czy to nie oznacza, że ​​moja aplikacja musi działać? Nie chcę tego. Chcę, aby moja aplikacja była uruchamiana tylko wtedy, gdy gps jest włączone/wyłączone, uruchom metodę, a następnie zakończ. Miałem wrażenie, że musicie użyć BroadcastReceivers, aby to zrobić, czy myliłem się? –

+0

Nie, masz całkowitą rację. Myliłem się, aby uzyskać ten punkt .. Moja zła – stinepike

+1

Moja wina, moje pytanie było trochę ogólne, dodałem teraz wyjaśnienie. –

2

Począwszy od API 19 można posłuchać za zamiarem działania LocationManager.MODE_CHANGED_ACTION.

Można również uzyskać aktualny tryb lokalizacji następująco:

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

Zwrócona wartość powinna być jednym z nich:

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 
Powiązane problemy