Bei der Verwendung von Standortinformationen unter Android sind zwei wichtige Dinge zu tun.
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.
Erstellen Sie grob gesagt eine Aktivität, die mit dem folgenden Ablauf verarbeitet wird.
Das tatsächliche Ergebnis ist hier
Der tatsächliche Code wird unten beschrieben.
(Bitte überprüfen Sie das Muster des Liefergegenstandes hier)
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.
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.
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.
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)
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);
}
}
}
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);
}
}
});
}
Deshalb ist das Ergebnis hier.
Recommended Posts