"Settings-Auswahl" nach Start von Service

  • 9 Antworten
  • Letztes Antwortdatum
ui_3k1

ui_3k1

Gesperrt
197
Hallo,
ich suche einen schlauen Kopf, der weiß wie ich einen "Settings-Intent" aufrufen kann, falls eine Systemeinstellung verhindert, dass ein Service genutzt werden kann.

Ausgangslage:
Ich habe einen Service, der GPS-Daten bezieht und diese verarbeitet.
Dieser Service wird direkt nach dem Booten gestartet.
Sollte GPS ausgeschaltet sein, kommt normalerweise ein Fehler, den ich aber mit try...catch fange. Somit kommt zwar kein Fehler mehr, aber die App startet auch nicht (bzw. die Funktion der App wird damit nicht nutzbar).

Deswegen suche ich jetzt eine Möglichkeit, wie ich direkt nach dem Booten prüfe, ob GPS angeschaltet ist und falls es deaktiviert ist, soll ein Settings-Intent gestartet werden.
 
Wenn der Service läuft teste doch direkt dort ob GPS eingeschaltet ist. Werte dazu doch einfach den Fehler in der Catch-Klause aus und wenn es der richtige ist starte die Settings Activity.
 
Vielen Dank für die Antwort.
Das habe ich versucht, aber aus einem Service heraus eine Activity zu starten führt bei mir zu Fehlern.
 
Wie hast du es denn versucht und welche Fehler sind aufgetreten?
 
So sah der Versuch aus...

Code:
    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        // Initialize LOCATION-MANAGER
        LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        boolean enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        if (!enabled)
        {
            Toast.makeText(this, R.string.prompt_app_inactive, Toast.LENGTH_SHORT).show();
          [COLOR=Blue][B]  // hier war der Aufruf fuer Intent [/B][/COLOR]
            stopSelf();
        }

        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
        return START_STICKY;
    }
Eine andere (unprogrammierte) Idee von mir:
Code:
    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        // Initialize LOCATION-MANAGER
        LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        boolean enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        if (!enabled)
        {
            Toast.makeText(this, R.string.prompt_app_inactive, Toast.LENGTH_SHORT).show();
          [COLOR=Blue][B] [COLOR=Red]r[/COLOR][/B][/COLOR][COLOR=Red][B]eturn [/B]*Service vergessen*[/COLOR] [B]<- geht das irgendwie?[/B]
        } [COLOR=Red]else
        {[/COLOR]
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
        [B]return [/B]START_STICKY;
        [COLOR=Red]}[/COLOR]
}

Aber generell ist mir vieles noch nicht so 100%tig klar.

Die App soll praktisch immer aktiv sein, wenn die GPS Einstellung aktiv ist und genau dieser Punkt gestaltet sich derzeit noch als schwierig.
Gibt es eine Möglichkeit die Anwendung an das "aktiv-sein" der GPS-Einstellung zu koppeln? Anderenfalls müsste ich wahrscheinlich noch eine zeitliche regelmäßige Überprüfung durchführen, oder?
Entweder bin ich gerade extrem lahm im Kopf, oder es scheint mir so als müssten extrem viele (relativ sinnlose) Abfragen im Hintergrund laufen, damit diese Anwendung dauerhaft laufen kann.
 
Zuletzt bearbeitet:
Naja mit der Version kann man nun nicht sooo viel Anfangen. Man kann ja nicht wissen was beim öffnen schief gelaufen ist wenn es nicht mehr da steht :smile:
 
Hehe, da hast du wohl recht.

Aufruf des Intents:
Code:
Intent settingsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(settingsIntent);
Hier der Log:
Code:
05-07 16:05:55.247: W/asset(13425): Unable to load asset /data/app/com.rayford85.flat-1.apk, ResTable not updated
05-07 16:05:55.417: D/AndroidRuntime(13425): Shutting down VM
05-07 16:05:55.417: W/dalvikvm(13425): threadid=1: thread exiting with uncaught exception (group=0x417e9ce0)
05-07 16:05:55.417: E/AndroidRuntime(13425): FATAL EXCEPTION: main
05-07 16:05:55.417: E/AndroidRuntime(13425): Process: de.clevercomputing.justdrive, PID: 13425
05-07 16:05:55.417: E/AndroidRuntime(13425): java.lang.RuntimeException: Unable to start service de.clevercomputing.justdrive.module.ServiceCheckGPS@423b4058 with Intent { cmp=de.clevercomputing.justdrive/.module.ServiceCheckGPS }: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
05-07 16:05:55.417: E/AndroidRuntime(13425):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2739)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at android.app.ActivityThread.access$2100(ActivityThread.java:145)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at android.os.Handler.dispatchMessage(Handler.java:102)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at android.os.Looper.loop(Looper.java:136)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at android.app.ActivityThread.main(ActivityThread.java:5149)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at java.lang.reflect.Method.invokeNative(Native Method)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at java.lang.reflect.Method.invoke(Method.java:515)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:133)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at dalvik.system.NativeStart.main(Native Method)
05-07 16:05:55.417: E/AndroidRuntime(13425): Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
05-07 16:05:55.417: E/AndroidRuntime(13425):     at android.app.ContextImpl.startActivity(ContextImpl.java:1091)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at android.app.ContextImpl.startActivity(ContextImpl.java:1078)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at android.content.ContextWrapper.startActivity(ContextWrapper.java:311)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at de.clevercomputing.justdrive.module.ServiceCheckGPS.onStartCommand(ServiceCheckGPS.java:109)
05-07 16:05:55.417: E/AndroidRuntime(13425):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2722)
05-07 16:05:55.417: E/AndroidRuntime(13425):     ... 11 more
So richtig schlau werde ich nicht draus. :-/

Bzw: "FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?" -> das würde ich mit "ja" beantworten...
 
Dann setz den Flag doch einfach.

Code:
Intent settingsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
            startActivity(settingsIntent);

Versuch macht kluch.
 
  • Danke
Reaktionen: ui_3k1
NACHTRAG:
funktioniert. :D

Der ursprüngliche Beitrag von 16:18 Uhr wurde um 16:19 Uhr ergänzt:

JustinTime schrieb:
Dann setz den Flag doch einfach.

Jo, 1000 Dank! :thumbsup:
 
Eine kleine Frage habe ich doch noch...

Ausgangsszenario:
Meine App startet nach dem Booten und führt den Service aus.
Ebenso kann der Service gestartet werden, wenn der Service beendet wurde und die App neu aufgerufen wurde.
Was noch nicht klappt:
Service beendet und App nicht mehr aufgerufen (also Service inaktiv), aber Einstellung in der App gewählt, dass die App aktiv sein soll.

Wie bekommt man es hin, dass in regelmäßigen Abständen eine Routine abläuft, die prüft, ob die Einstellung auf "aktiv" steht?
Ist hier ein zweiter Service nötig? Mit der Vorstellung dass ich einen Service anlege um einen anderen zu aktivieren kann ich mich nicht so recht anfreunden.
 

Ähnliche Themen

D
Antworten
5
Aufrufe
572
swa00
swa00
Zurück
Oben Unten