Wie? Hören Sie für die Standort-Einstellung eingeschaltet ist (Android App)

Also ich habe in den letzten Wochen die arbeiten auf meiner Android-App und Suche nach der besten Art und Weise der Umsetzung, was ich tun muss, aber immer noch nicht so Recht, it-Recht.. Jeder/jede Hilfe ist sehr geschätzt, als ich bin noch immer den Dreh raus..

Aufgabe:

(Vorausgesetzt, die "Location"/GPS-Einstellung ist derzeit aus), brauche ich, um meine App, die ständig überwacht werden für die "Location" - Einstellung eingeschaltet werden.. An diesem Punkt, starten Sie einfach eine Aktivität.

Ideen:

Diese sind alle die verschiedenen Möglichkeiten, die ich denke, könnte es möglicherweise funktionieren:

  • LocationListener mit "onProviderEnabled"

  • GpsStatusListener mit "onGpsStatusChanged" mit "GPS_EVENT_STARTED"

  • GpsProvider requiresSatellite (um festzustellen, ob es startet), oder irgendwie verwenden die GpsProvider ist "VERFÜGBAR" - Konstante/int

  • SettingInjectorService mit "ACTION_SERVICE_INTENT" (und/oder) "ACTION_INJECTED_SETTING_CHANGED" mit "onGetEnabled" oder "isEnabled"

  • Einstellungen.Sicher mit "LOCATION_MODE" != "LOCATION_MODE_OFF"

  • einen ContentObserver/ContentResolver

  • Absicht getAction (...)

  • Einer "if/else" von einer Art

Fragen:

Jede Art von Rat oder Antworten für jede der folgenden Fragen sind sehr geschätzt..

  • Welche die Ideen über die beste Art der Erfüllung der Aufgabe? Einfacher ist besser, aber am wichtigsten ist es muss überwacht werden, zu allen Zeiten, und sofort reagieren, wenn sich der Speicherort-Einstellung eingeschaltet ist.

  • Je nachdem, in welcher eine der Ideen, die oben am besten funktioniert, wie würde ich das umsetzen? (Zum Beispiel, brauche ich ein BroadcastListener? oder ein Service? und wie wäre es alle zusammen Stück?

Ich schätzen jede Beratung oder Hilfe, die Sie mir geben können.. ich bin noch immer den Dreh raus, aber sicher genug, es zu tun, und eifrig zu veröffentlichen meine erste App.. So danke, es bedeutet viel und wird sehr helfen Sie mir zusammen.

EDIT:

OK Also hier ist, was ich habe, so weit...


Hier ist mein Receiver:

MyReceiver.Java

public class MyReceiver extends BroadcastReceiver {

    private final static String TAG = "LocationProviderChanged";

    boolean isGpsEnabled;
    boolean isNetworkEnabled;



    public MyReceiver() {
    //EMPTY

    //MyReceiver Close Bracket
    }



    //START OF onReceive
    @Override
    public void onReceive(Context context, Intent intent) {


        //PRIMARY RECEIVER
        if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {

            Log.i(TAG, "Location Providers Changed");

            LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
            isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            Toast.makeText(context, "GPS Enabled: " + isGpsEnabled + " Network Location Enabled: " + isNetworkEnabled, Toast.LENGTH_LONG).show();

            //START DIALOG ACTIVITY
            if (isGpsEnabled || isNetworkEnabled) {
                Intent runDialogActivity = new Intent(context, DialogActivity.class);
                context.startActivity(runDialogActivity);

            }

        }



        //BOOT COMPLETED (REPLICA OF PRIMARY RECEIVER CODE FOR WHEN BOOT_COMPLETED)
        if (intent.getAction().matches("android.intent.action.BOOT_COMPLETED")) {

            Log.i(TAG, "Location Providers Changed Boot");

            LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
            isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            Toast.makeText(context, "GPS Enabled Boot: " + isGpsEnabled + " Network Location Enabled Boot: " + isNetworkEnabled, Toast.LENGTH_LONG).show();

            //START DIALOG ACTIVITY
            if (isGpsEnabled || isNetworkEnabled) {
                Intent runDialogActivity = new Intent(context, DialogActivity.class);
                context.startActivity(runDialogActivity);

            }

        }



    //onReceive CLOSE BRACKET
    }



//CLOSE OF FULL CLASS
}

Und heres, was das Manifest sieht wie folgt aus:

Manifest.XML

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ender.projects.receivertest">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:fullBackupContent="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".DialogActivity">
        </activity>

        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.location.PROVIDERS_CHANGED" />

                <action android:name="android.intent.action.BOOT_COMPLETED" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

    </application>

</manifest>

Abgesehen von diesen Dateien habe ich die folgenden Dateien bestehen:

MainActivity.Java und DialogActivity.Java sowohl mit Layout-Dateien

activity_main.xml und activity_dialog.xml Spiel mit Ihnen.

Also wenn ich das richtig verstanden, wenn der Benutzer lädt die App und öffnet Sie, meine MainActivity.Java und entsprechende layout zu starten. Aber ich bin nur gehen, um diese zu verwenden einfach nur als Voreinstellungen-Bildschirm. Also, sobald Sie die App öffnen, für die erste Zeit, die Broadcast-Empfänger sollte automatisch starten Sie hören für die STANDORT-Einstellung eingeschaltet werden, richtig? Ich will auch die Broadcast-Listener, um zu bleiben hören, sogar nach dem Eingang der ersten Sendung (so, dass mein onReceive immer noch feuert, wenn Sie schalten Sie die STANDORT-Einstellung " off " und dann später wieder einschalten..

So (A) Wie muss mein code Aussehen, so weit?

und (B) Zu erreichen, was ich eben beschrieben habe, was müsste Hinzugefügt werden?

und (C) es gibt diesen Fehler wenn ich die STANDORT Einstellung AUF.

..Wie kann ich es beheben?:

java.lang.RuntimeException: Unable to start receiver com.bryce.projects.servicesthreadsetc.MyReceiver: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?


Vielen Dank nochmal für die Hilfe!

  • Also wie genau würde ich das implementieren? Es Klang wie das GpsStatusListener war eine bessere option, da braucht es nur 1 Methode, während die LocationListener hat wie 4.. Aber in jedem Fall, was würden die Schritte sein, wo man alles zu setzen? Da es bereits einen Listener auf eigene (wie ich finde), sollte ich einfach ausführen, innerhalb einer Service (, anstatt in einem BroadcastListener) oder was?
  • So ein paar Fragen.. Wenn ich die LocationListener, um zu bestimmen, den genauen Zeitpunkt der Umschaltung auf die Standort Einstellung AUF "on" (und damit nur mit onProviderEnabled), würde ich noch brauchen, um die Breite und Länge usw wie in dem Beispiel? Und Frage 2 ist, brauche ich eine Prozedur wie im Beispiel, wie auch? Wenn ich mich nicht Irre, es ist hard-coded in der LocationListener schon richtig? Wie ist die Funktion einer BroadcastListener, das heißt, ich brauche nicht, dass entweder, und kann führen Sie einfach den code in eine Leistung (oder Aktivität ohne Layout) korrekt? oder nicht? Dank
  • Wieder, ich don ' T sogar Notwendigkeit, die tatsächliche Lage auch immer.. ich habe buchstäblich NUR meine App im wesentlichen zu hören, wenn "Location" aktiviert wird, und starten Sie dann eine neue Aktivität. Das ist es. Aber anders als das, meine App hat NICHTS zu tun mit der Lage oder was auch immer (abgesehen von der im hintergrund läuft und anspringt, meine nächste Aktivität sobald der Standort EINSTELLUNG aktiviert wird).. ändert das nichts, so weit als die beste option?
  • Wenn Sie sagen, "verwenden der BroadcastReceiver für android. Lage.PROVIDERS_CHANGED", sind Sie immer noch unter Bezugnahme auf die Verwendung der LocationListener (im Dienst), ODER sagen Sie implementieren eine Art von "If/Else" - Anweisung mit PROVIDERS_CHANGED irgendwie in eine tatsächliche BroadcastListener?
  • Ich wünschte, es gäbe eine Möglichkeit für uns zu kommunizieren mehr leicht.. ich habe ein paar mehr Fragen zu diesem Thema, sind ziemlich basic, aber ich möchte nicht, dass dieser post/thread zu lang.. Würde es Ihnen etwas ausmachen, wenn ich Sie per E-Mail? Wenn ich könnte Ihre E-Mail-das wäre super-hilfreich bei der Erreichung meiner Ziele. Ich wirklich schätzen Ihre Hilfe.
  • Ich warf einen Blick auf den link, den Sie gab mir, und es scheint Sinn zu machen.. Aber, Sie erwähnen eine Art "Bibliothek" auf ein paar Gelegenheiten in der post.. muss ich nutzen, eine Art Bibliothek? Oder kann ich einfach diesen code in eine Empfänger, und habe eine Schaltfläche in mein Haupt-app starten Sie den Empfänger und schließen Sie sich?
  • Genial, ich werde es versuchen und wieder, um Sie mit weiteren Fragen.. Aber ich bin einfach neugierig, was ist der Unterschied zwischen dem ausführen eines BroadcastReceiver mit einem Vorsatz, vs läuft ein Dienst unter Verwendung der LocationListener? Ist es nicht im Grunde das gleiche? Denken Sie daran, ich brauche es, um ausgeführt werden zu allen Zeiten, auch wenn meine App nicht. Und auch Zuhören starten automatisch, wenn das system gestartet etc. Wie also würden die 2 Methoden unterscheiden?
  • Zum Beispiel, in meiner MainActivity, die ich habe zu verwenden eine Absicht, um tatsächlich Beginnen mein Service, wenn Sie eine Taste drücken.. Aber brauche ich dies für mein Receiver in einer ähnlichen Art und Weise? Oder wie funktioniert der Receiver anfangen?
  • Ich habe gerade eine Antwort, ich glaube wirklich, es ist einfach so. Lassen Sie mich wissen, wenn es für Sie arbeitet!
  • Ich habe jetzt die gesamte Empfänger codiert werden, sowie das Manifest, beide, wie Sie beschrieben ist.. Meine einzige Verbleibende Fragen sind: Wie stellen Sie sicher, dass der Empfänger aktiv bleibt, in dem Fall, dass der Benutzer schaltet die Location-Service und dann geht es wieder.. im Grunde will ich es hören jederzeit für Sie eingeschaltet wird, auch nach dem ersten Erhalt der Sendung,.. Sinn? Möchte nur sicherstellen, dass der Empfänger nicht getötet werden.. Und danke nochmal für die Hilfe..
  • Sollten Sie die Dokumentation Lesen, die auf BroadcastReceivers, die Schönheit von Ihnen ist, dass Sie nicht immer ausgeführt wird (so dass Ihre app wird nicht Essen, bis Lebensdauer der Batterie), aber wenn der Anbieter eine Veränderung geschieht, das Betriebssystem startet Ihr die app und führt den BroadcastReceiver ist onReceive. Gehen Sie weiter und testen Sie es, und stellen Sie sicher, dass es funktioniert für Ihre Bedürfnisse!
  • Genial, ich werde es ausprobieren, und danke nochmal.. ich habe eigentlich die Dokumentation, wie wir sprechen.. Das einzige Problem ist, ich will "der Start meiner nächsten Aktivität nach dem Empfang des Broadcast", um eine Option kann der Benutzer die Einstellung On oder Off. Aber es klingt wie die Empfänger werden immer ausgeführt werden. Brauche ich auch, um sicherzustellen, dass es nicht getötet werden nach dem Empfang der ersten Sendung, so wird es auch weiterhin, um darauf zu reagieren. Gibt es einen code, der benötigt wird, um eine erneute Initialisierung des Empfängers nach der onReceive-code, oder macht es automatisch wieder anlegen?
  • Verwenden Sie einfach ein SharedPreference Wert zu speichern, was der Benutzer gewählt hat, und überprüfen Sie den Wert des SharedPreference in der BroadcastReceiver. Wenn der Benutzer es deaktiviert ist, starten Sie nicht die Aktivität in der onReceive() in der BroadcastReceiver.
  • OK Also ich habe gerade meinem ursprünglichen post bearbeitet und ergänzt den Code habe ich so weit.. Könnte nehmen Sie einen Blick auf mein Edit oben, und die Fragen, die unter ihm? Danke Daniel!

InformationsquelleAutor Ender87 | 2016-03-31
Schreibe einen Kommentar