[GO] Ich habe versucht, eine Aktivität zu erstellen, die gemeinsam die Positionsinformationen festlegt

Hintergrund

Bei der Verwendung von Standortinformationen unter Android sind zwei wichtige Dinge zu tun.

  1. Aktivieren Sie die Berechtigung
  2. Aktivieren Sie die Einstellung für die Standortinformationen des Terminals

Es gibt verschiedene Möglichkeiten, die beiden oben genannten zu aktivieren. Jetzt gibt es einen Mechanismus, mit dem Sie den Prozess nur innerhalb der App ausführen können.

Die Methode ist jedoch ein wenig mühsam ... oder besser gesagt, sie ist aus den folgenden Gründen ein wenig mühsam, obwohl ich alles zusammenstellen möchte. .. ..

Aus diesem Grund haben wir dieses Mal eine "dedizierte Aktivität erstellt, die sowohl die Einstellungen für Berechtigungen als auch für Standortinformationen zusammen aktiviert", damit sie von überall verwendet werden kann.

Was du machen willst

Erstellen Sie grob gesagt eine Aktivität, die mit dem folgenden Ablauf verarbeitet wird.

  1. Aktivität anrufen
  2. Überprüfen Sie zuerst die Berechtigung --Nicht erlaubt: Erlaubnis anfordern (Anzeigedialog)
  1. Überprüfen Sie als Nächstes die Einstellung für die Standortinformationen --Nicht eingestellt: Stellen Sie eine Einstellungsanforderung (Dialogfeldanzeige)

Das tatsächliche Ergebnis ist hier

Der tatsächliche Code wird unten beschrieben.

1. Aktivität anrufen

(Bitte überprüfen Sie das Muster des Liefergegenstandes hier)

2. Überprüfen Sie zuerst die Berechtigung

Lassen Sie uns zunächst ein wenig über die Berechtigung sprechen.

Mit der Einführung des Runtime Permission-Mechanismus ab OS 6.0 oder höher gibt es die folgenden zwei Berechtigungen (gefährliche Bezeichnung), für die eine Berechtigung erforderlich ist, während die Anwendung als Standortinformationen ausgeführt wird.

(Einzelheiten zur Berechtigung selbst finden Sie unter Offizielle Referenz usw.)

permission Inhalt
ACCESS_COARSE_LOCATION Netzwerkbasierter Zugriff auf ungefähre Standortinformationen
ACCESS_FINE_LOCATION Zugriff auf bestimmte Standortinformationen wie GPS

Überprüfen Sie daher zunächst in onCreate of Activity, ob die oben genannte Berechtigung zulässig ist (im Fall von OS 6.0 oder höher), und gehen Sie wie folgt vor.

private static final int REQUEST_CODE_LOCATION_PERMISSION = 1;
private static final String[] PERMISSIONS = {
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.ACCESS_FINE_LOCATION
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    if (isPermissionGranted()) {
        // (6.Weniger als 0 oder bereits erlaubt)
        //Da dies zulässig ist, legen Sie die Standortinformationen des Terminals fest
        requestLocationSetting();
        return;
    }
    // (6.0 oder mehr)
    //Berechtigungen anfordern
    ActivityCompat.requestPermissions(this, PERMISSIONS, REQUEST_CODE_LOCATION_PERMISSION);
}

private boolean isPermissionGranted() {
    for (String permission : PERMISSIONS) {
        if (PermissionChecker.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
    return true;
}

Wenn eine Berechtigungsanforderung gestellt wird, wird der folgende Dialog angezeigt.

permission_dialog.png

Als Nächstes erhalten Sie einen Rückruf aus dem Dialogfeld. Wenn die Berechtigung jedoch erfolgreich ist, wechseln Sie zur Einstellung für Standortinformationen. Wenn Sie dies ablehnen, beenden Sie sie.

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (permissions.length != grantResults.length) {
        setResultCode(Locset.ResultCode.PERMISSION_FAILURE);
        return;
    }
    for (int i = 0; i < grantResults.length; i++) {
        if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
            //Abgelehnt
            //  1.Wenn Sie eine Berechtigung übergeben, die Sie nie angefordert haben, wird false zurückgegeben
            //  2.Wenn die angeforderte Berechtigung mit einem Häkchen "Nicht mehr anzeigen" abgelehnt wird, wird false zurückgegeben.
            //  3.Gibt true zurück, wenn die angeforderte Berechtigung verweigert wurde und nicht aktiviert ist, um sie erneut auszublenden
            //Hinweis) Beachten Sie, dass 1 und 2 nicht unterschieden werden können.
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {
                //Ergebnis an Anrufer zurückgeben (Fehler)
                finishForResult(Locset.ResultCode.PERMISSION_FAILURE);
            } else {
                //Ergebnis an Anrufer zurückgeben (Fehler)
                finishForResult(Locset.ResultCode.PERMISSION_FAILURE_DO_NOT_ASK_AGAIN);
            }
            return;
        }
    }
    //Da dies zulässig ist, legen Sie die Standortinformationen des Terminals fest
    requestLocationSetting();
}

private void finishForResult(@Locset.ResultCode int resultCode) {
    setResult(resultCode);
    finish();
}

Dies ist das Ende der Berechtigungsverarbeitung.

3. Überprüfen Sie als Nächstes die Einstellung für die Standortinformationen

Sie können die Standortinformationen direkt über den Terminaleinstellungsbildschirm oder den Benachrichtigungsbereich festlegen. Mithilfe der Funktion von Google Play Services können Sie sie jedoch direkt in der App festlegen. Kann eingestellt werden.

Fügen Sie vorerst play-services-location zu build.gradle hinzu.

implementation 'com.google.android.gms:play-services-location:11.8.0'

Die Implementierung unterscheidet sich übrigens je nach Version von Google Play Services geringfügig. Um klar zu sein, sind Version 11 und höher viel einfacher zu implementieren.

version Implementierungsmethode
11.Weniger als 0 Benötigt Google Api Client
LocationServices.Verwenden Sie Einstellungen API
Referenz
11.0 oder mehr Verwenden Sie den Einstellungsclient
Referenz

Darüber hinaus kann die Einstellung der Standortinformationen die Genauigkeit der gewünschten Informationen und den Batterieverbrauch berücksichtigen. Grundsätzlich können Sie die folgenden vier Prioritäten angeben.

public final class LocationRequest extends zzbfm implements ReflectedParcelable {
    public static final int PRIORITY_HIGH_ACCURACY = 100;
    public static final int PRIORITY_BALANCED_POWER_ACCURACY = 102;
    public static final int PRIORITY_LOW_POWER = 104;
    public static final int PRIORITY_NO_POWER = 105;

In Android unterscheiden sich die Einstellungen für Standortinformationen je nach Betriebssystemversion geringfügig (möglicherweise nach Modell). Die Verwendung dieser GooglePlayServices bietet jedoch den Vorteil, dass die oben genannte Priorität festgelegt wird.

weniger als v11.0

Wenn es weniger als v11 ist, müssen Sie zuerst eine Verbindung zu Google Api Client herstellen.

private void requestLocationSetting() {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
                    finishForResult(Locset.ResultCode.GOOGLE_API_FAILURE);
                }
            })
            .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle bundle) {
                    //Starten Sie nach der Verbindung die Erfassung der Standortinformationen
                    requestLocationSettingGoogleApi();
                }

                @Override
                public void onConnectionSuspended(int i) {
                    finishForResult(Locset.ResultCode.GOOGLE_API_FAILURE);
                }
            }).build();
    mGoogleApiClient.connect();
}

Nach dem Herstellen einer Verbindung zu GoogleApiClient werden die Standortinformationseinstellungen des Terminals überprüft und der Dialog zum Einstellen angezeigt. (Ergänzend ist dieser Einstellvorgang ohne Erlaubnis möglich)

locationsetting.png

private static final int REQUEST_CODE_LOCATION_SETTING = 2;

private void requestLocationSettingGoogleApi() {
    final LocationSettingsRequest request = new LocationSettingsRequest.Builder()
            .setAlwaysShow(true) //Wenn Sie dies nicht tun, können Sie nicht weiter anrufen, wenn Sie es nicht ändern
            .addLocationRequest(LocationRequest.create().setPriority(mPriority))
            .build();

    final PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(
            mGoogleApiClient,
            request);

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
            final Status status = locationSettingsResult.getStatus();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    //Die Standortinformationen der angegebenen Priorität können verwendet werden
                    finishForResult(Locset.ResultCode.SUCCESS);
                    return;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    try {
                        //Zeigen Sie einen Dialog an, in dem der Benutzer die Einstellungen für die Standortinformationen ändern kann
                        status.startResolutionForResult(LocsetActivity.this, REQUEST_CODE_LOCATION_SETTING);
                        return;
                    } catch (IntentSender.SendIntentException e) {
                        // failure
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    //Wird aufgerufen, wenn keine Standortinformationen abgerufen werden können und es schwierig ist, diesen Status wiederherzustellen
                    break;
            }
            finishForResult(Locset.ResultCode.LOCATION_SETTING_FAILURE);
        }
    });
}

Schließlich erhält onActivityResult den Rückruf des Einstellungsergebnisses.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    //Erhalten Sie einen Rückruf über das Dialogfeld zur Einstellung der Standortinformationen
    if (requestCode == REQUEST_CODE_LOCATION_SETTING) {
        if (resultCode == Activity.RESULT_OK) {
            finishForResult(Locset.ResultCode.SUCCESS);
        } else {
            finishForResult(Locset.ResultCode.LOCATION_SETTING_FAILURE);
        }
    }
}

v11.0 oder höher

In Version 11 und höher ist GoogleApiClient nicht mehr erforderlich und wird mit einer Klasse namens SettingsClient ausgeführt. Es gibt keine besonderen Änderungen bei der Art und Weise, wie Sie Ihre Rückrufe erhalten.

private void requestLocationSetting() {
    final LocationSettingsRequest request = new LocationSettingsRequest.Builder()
            .setAlwaysShow(true)
            .addLocationRequest(LocationRequest.create().setPriority(mPriority))
            .build();
            
    final Task<LocationSettingsResponse> result = LocationServices.getSettingsClient(this)
            .checkLocationSettings(request);

    result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
        @Override
        public void onComplete(@NonNull Task<LocationSettingsResponse> task) {
            try {
                task.getResult(ApiException.class);
                //Bereits eingestellt
                finishForResult(Locset.ResultCode.SUCCESS);
            } catch (ApiException exception) {
                switch (exception.getStatusCode()) {
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        try {
                            //Zeigen Sie einen Dialog an, in dem der Benutzer die Einstellungen für die Standortinformationen ändern kann
                            resolvable.startResolutionForResult(LocsetActivity.this, REQUEST_CODE_LOCATION_SETTING);
                            return;
                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.
                        } catch (ClassCastException e) {
                            // Ignore, should be an impossible error.
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        //Wird aufgerufen, wenn keine Standortinformationen abgerufen werden können und es schwierig ist, diesen Status wiederherzustellen
                        break;
                }
                finishForResult(Locset.ResultCode.LOCATION_SETTING_FAILURE);
            }
        }
    });
}

Schließlich

Deshalb ist das Ergebnis hier.

Recommended Posts

Ich habe versucht, eine Aktivität zu erstellen, die gemeinsam die Positionsinformationen festlegt
Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
[Python] Ich habe versucht, mit tkinter eine Anwendung zu erstellen, die das Gehalt anhand der Arbeitszeit berechnet
Ich habe versucht, ein System zu erstellen, das nur gelöschte Tweets abruft
Ich habe versucht, in 3 Jahren 5 Muster der Analysebasis zu erstellen
[Python] Einfaches Japanisch ⇒ Ich habe versucht, ein englisches Übersetzungswerkzeug zu erstellen
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, eine Site zu erstellen, mit der die aktualisierten Informationen von Azure einfach angezeigt werden können
Ich möchte ein Automatisierungsprogramm erstellen!
Ich habe eine Web-API erstellt
Ich habe versucht, eine Originalsprache "PPAP Script" zu erstellen, die PPAP (Pen Pineapple Appo Pen) mit Python abbildet
Ich habe mit TWE-Lite-2525A einen Öffnungs- / Schließsensor (Twitter-Link) erstellt
Ich habe versucht, durch Schaben ein Bild zu bekommen
Ich habe versucht, KI für Smash Bra zu machen
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
[Python] Ich habe versucht, eine Shiritori-KI zu erstellen, die den Wortschatz durch Schlachten verbessert
Ich habe versucht, einen Übersetzungs-BOT zu erstellen, der mit Discord unter Verwendung von Googletrans funktioniert
Ich habe versucht, ein Wörterbuch ohne Berücksichtigung der Groß- und Kleinschreibung zu erstellen
Ich habe mein Bestes versucht, um eine Optimierungsfunktion zu erstellen, aber es hat nicht funktioniert.
Ich habe versucht, einen "verdammt großen Literaturkonverter" zu machen.
Ich habe versucht, eine Luftlippenerkennung und eine automatische Reaktion BOT für Fernarbeit zu machen
[LPIC 101] Ich habe versucht, die Befehlsoptionen zusammenzufassen, die leicht zu Fehlern führen können
Ich habe versucht, einen automatischen Charakterdialoggenerator für die Markov-Kette im N-Stock zu erstellen
Fortsetzung ・ Ich habe versucht, Slackbot zu erstellen, nachdem ich Python3 studiert habe
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht zu debuggen.
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Ich habe versucht, mit OpenCV Ann Man zu werden
Ich habe versucht, eine Memo-App zu erstellen, die Pomodoro sein kann, aber eine Reflexionsaufzeichnung
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Es ist Katzentag, also habe ich versucht, etwas zu machen, das sich in katzenähnliche Wörter übersetzt.
Ich habe versucht, die alternative Klasse mit Tensorflow zu finden
[1 Stunde Herausforderung] Ich habe versucht, eine Wahrsagerseite zu erstellen, die für Python zu geeignet ist
Ich habe versucht, einen Generator zu erstellen, der mit Python eine C # -Containerklasse aus CSV generiert
Ich habe versucht, Othello AI zu machen, dass ich 7,2 Millionen Hände durch tiefes Lernen mit Chainer gelernt habe
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe versucht, die Zugverspätungsinformationen mit LINE Notify zu benachrichtigen
Ich habe versucht, die Informationen des Webs mit "Requests" und "lxml" abzurufen.
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, verschiedene Informationen von der Codeforces-API abzurufen
Ich habe mit PyQt einen einfachen Texteditor erstellt
Ich habe versucht, einen Artikel mit SQL Alchemy auf Wiki.js zu erstellen
Ich habe versucht, PredNet zu lernen
Ich habe versucht, SVM zu organisieren.
Ich habe versucht, PCANet zu implementieren
Ich habe versucht, Linux wieder einzuführen
Ich habe versucht, Pylint vorzustellen
Ich habe versucht, SparseMatrix zusammenzufassen
jupyter ich habe es berührt
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, ein Schätzmodell für Artikeltitel zu erstellen, die wahrscheinlich mit Qiita in Einklang stehen
Ich habe versucht, das automatische Senden einer E-Mail durch Doppelklicken auf das Symbol [Python] zu ermöglichen
Ich habe HR Tech versucht, eine Expertensuchmaschine zu entwickeln, indem ich interne Besprechungsinformationen maschinell gelernt habe
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert