【发布时间】:2021-04-26 19:21:31
【问题描述】:
我正在构建一个地图应用程序,因此我想在运行时请求位置权限。 实际上,当位置权限出现时,应用程序会自行关闭。
我必须选择权限,然后再次打开应用程序。
代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
mapView = mapFragment.getView();
getSupportActionBar().setTitle("My map");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
if ( Build.VERSION.SDK_INT >= 23){
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED ){
requestPermissions(new String[]{
android.Manifest.permission.ACCESS_FINE_LOCATION},
LOCATION_PERMISSION_REQUEST_CODE);
//Provo a chiamare un dialog per la localizzazione
settingsrequest();
return ;
}
}
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
MobileAds.initialize(this);
mAdView = findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
}
public void settingsrequest() {
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10);
mLocationRequest.setSmallestDisplacement(10);
mLocationRequest.setFastestInterval(10);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationSettingsRequest.Builder builder = new
LocationSettingsRequest.Builder();
builder.addLocationRequest(mLocationRequest);
Task<LocationSettingsResponse> task = LocationServices.getSettingsClient(this).checkLocationSettings(builder.build());
task.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
@Override
public void onComplete(Task<LocationSettingsResponse> task) {
try {
LocationSettingsResponse response = task.getResult(ApiException.class);
// All location settings are satisfied. The client can initialize location
// requests here.
} catch (ApiException exception) {
switch (exception.getStatusCode()) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the
// user a dialog.
try {
// Cast to a resolvable exception.
ResolvableApiException resolvable = (ResolvableApiException) exception;
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
resolvable.startResolutionForResult(
MapsActivity.this,
101);
} catch (IntentSender.SendIntentException e) {
// Ignore the error.
} catch (ClassCastException e) {
// Ignore, should be an impossible error.
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings are not satisfied. However, we have no way to fix the
// settings so we won't show the dialog.
break;
}
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) {
return;
}
if (PermissionUtils.isPermissionGranted(permissions, grantResults, Manifest.permission.ACCESS_FINE_LOCATION)) {
// Enable the my location layer if the permission has been granted.
enableMyLocation();
} else {
// Permission was denied. Display an error message
// Display the missing permission error dialog when the fragments resume.
permissionDenied = true;
}
}
public void setUpMap() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
fusedLocationClient.getLastLocation()
.addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
// Got last known location. In some rare situations this can be null.
if (location != null) {
Location lastLocation = location;
LatLng currentLatLng = new LatLng(location.getLatitude(), location.getLongitude());
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 14f));
} else {
LatLng cippo109 = new LatLng(41.52123, 13.50557);
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(cippo109, 10f));
}
}
});
}
@SuppressLint("MissingPermission")
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.getUiSettings().setZoomControlsEnabled(true);
mMap.setOnMyLocationButtonClickListener(this);
mMap.setOnMyLocationClickListener(this);
enableMyLocation();
setUpMap();
do something here...
}
我尝试搜索很多其他问题,但没有解决我的问题。 由于完整的代码不相关,我粘贴了有关权限的函数。 授予权限后地图运行良好。
堆栈跟踪:
2021-01-22 10:33:44.370 512-542/system_process I/ActivityTaskManager: Displayed com.google.android.permissioncontroller/com.android.permissioncontroller.permission.ui.GrantPermissionsActivity: +2s945ms
2021-01-22 10:33:44.393 512-1896/system_process I/system_server: oneway function results will be dropped but finished with status OK and parcel size 4
2021-01-22 10:33:44.868 512-1896/system_process W/NotificationService: Toast already killed. pkg=it.iovara.trainassistant token=android.os.BinderProxy@ddf8206
2021-01-22 10:33:44.876 694-694/com.android.systemui W/ToastPresenter: Error calling back it.iovara.trainassistant to notify onToastHide()
android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(BinderProxy.java:540)
at android.app.ITransientNotificationCallback$Stub$Proxy.onToastHidden(ITransientNotificationCallback.java:141)
at android.widget.ToastPresenter.hide(ToastPresenter.java:248)
at com.android.systemui.toast.ToastUI.hideCurrentToast(ToastUI.java:112)
at com.android.systemui.toast.ToastUI.hideToast(ToastUI.java:107)
at com.android.systemui.statusbar.CommandQueue$H.handleMessage(CommandQueue.java:1295)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
2021-01-22 10:33:44.838 0-0/? I/binder: 694:694 transaction failed 29189/-22, size 104-0 line 3146
2021-01-22 10:33:44.938 150-150/? E/SELinux: avc: denied { find } for pid=16288 uid=2000 name=car_service scontext=u:r:shell:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=0
2021-01-22 10:33:44.942 16288-16288/? W/cmd: Can't find service car_service
2021-01-22 10:33:45.911 150-150/? E/SELinux: avc: denied { find } for pid=16294 uid=2000 name=car_service scontext=u:r:shell:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=0
2021-01-22 10:33:45.911 16294-16294/? W/cmd: Can't find service car_service
2021-01-22 10:33:46.311 362-362/? I/perfetto: probes_producer.cc:329 Producer stop (id=98)
2021-01-22 10:33:46.315 363-363/? I/perfetto: ng_service_impl.cc:1948 Tracing session 98 ended, total sessions:0
【问题讨论】:
标签: android google-maps android-permissions