android - 谷歌地图位置权限不显示安卓版本8+安卓开发
问题描述
Android 8 及以上版本不会弹出 Google 地图权限。对于 Android 5,它运行良好。
权限应该像下图那样弹出,但在Android 8+版本上不显示现在,我知道它与运行时权限有关。我添加了相关代码,但在我授予权限后应用程序停止了。
我做错了什么?
这些都是授予的所有权限。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
这是 onCreate() 中的代码
if (!checkPermission()) {
requestPermission();
}
这些是与权限检查和授予相关的代码
private boolean checkPermission() {
int result = ContextCompat.checkSelfPermission(getApplicationContext(), ACCESS_FINE_LOCATION);
int result1 = ContextCompat.checkSelfPermission(getApplicationContext(), ACCESS_COARSE_LOCATION);
return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED;
}
private void requestPermission() {
ActivityCompat.requestPermissions(this, new String[]{ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
if (grantResults.length > 0) {
boolean fineLocationAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
boolean coarseLocationAccepted = grantResults[1] == PackageManager.PERMISSION_GRANTED;
if (!(fineLocationAccepted && coarseLocationAccepted)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)) {
showMessageOKCancel("You need to allow access to both the permissions",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION},
PERMISSION_REQUEST_CODE);
}
}
});
return;
}
}
}
}
break;
}
}
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(MainActivity.this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show();
}
但是在我点击“允许”后应用程序崩溃了。
错误信息
2019-05-01 23:46:17.257 4519-16175/? E/PhenotypeFlagCommitter: Retrieving snapshot for com.google.android.gms.playlog.uploader failed
java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1063)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1352)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:278)
at asip.a(:com.google.android.gms@16091022@16.0.91 (040700-244116403):27)
at alhm.a(:com.google.android.gms@16091022@16.0.91 (040700-244116403):2)
at alhm.a(:com.google.android.gms@16091022@16.0.91 (040700-244116403):19)
at alhm.a(:com.google.android.gms@16091022@16.0.91 (040700-244116403):29)
at com.google.android.gms.clearcut.uploader.QosUploaderChimeraService.d(:com.google.android.gms@16091022@16.0.91 (040700-244116403):3)
at com.google.android.gms.clearcut.uploader.QosUploaderChimeraService.a(:com.google.android.gms@16091022@16.0.91 (040700-244116403):14)
at com.google.android.gms.clearcut.uploader.QosUploaderChimeraService.a(:com.google.android.gms@16091022@16.0.91 (040700-244116403):6)
at zse.run(:com.google.android.gms@16091022@16.0.91 (040700-244116403):5)
at rrt.b(:com.google.android.gms@16091022@16.0.91 (040700-244116403):32)
at rrt.run(:com.google.android.gms@16091022@16.0.91 (040700-244116403):21)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at rxx.run(Unknown Source:7)
at java.lang.Thread.run(Thread.java:764)
解决方案
这是我所做的
private void askForPermission(String permission, Integer requestCode) {
if (ContextCompat.checkSelfPermission(Main2Activity.this, permission) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(Main2Activity.this, permission)) {
//This is called if user has denied the permission before
//In this case I am just asking the permission again
ActivityCompat.requestPermissions(Main2Activity.this, new String[]{permission}, requestCode);
} else {
deviceSetting(getApplicationContext());
ActivityCompat.requestPermissions(Main2Activity.this, new String[]{permission}, requestCode);
}
} else {
deviceSetting(getApplicationContext());
Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
}
}
private void deviceSetting(Context context) {
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context)
.addApi(LocationServices.API).build();
googleApiClient.connect();
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(10000);
locationRequest.setFastestInterval(10000 / 2);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
builder.setAlwaysShow(true);
PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
@Override
public void onResult(LocationSettingsResult result) {
final Status status = result.getStatus();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
Log.e("tag", "All location settings are satisfied.");
startLocationUpdates();
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
Log.e("tag", "Location settings are not satisfied. Show the user a dialog to upgrade location settings ");
try {
// Show the dialog by calling startResolutionForResult(), and check the result
// in onActivityResult().
status.startResolutionForResult(Main2Activity.this, REQUEST_PERMISSIONS_LOCATION_SETTINGS_REQUEST_CODE);
} catch (IntentSender.SendIntentException e) {
Log.e("tag", "PendingIntent unable to execute request.");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Log.e(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog not created.");
break;
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (ActivityCompat.checkSelfPermission(this, permissions[0]) == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
deviceSetting(getApplicationContext());
} else {
saveData(latitude, longitude, "no");
Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("onActivityResult()", Integer.toString(resultCode));
//final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
switch (requestCode) {
case REQUEST_PERMISSIONS_LOCATION_SETTINGS_REQUEST_CODE:
switch (resultCode) {
case Activity.RESULT_OK: {
// All required changes were successfully made
Toast.makeText(getApplicationContext(), "Location enabled by user!", Toast.LENGTH_LONG).show();
startLocationUpdates();
break;
}
case Activity.RESULT_CANCELED: {
// The user was asked to change settings, but chose not to
Toast.makeText(getApplicationContext(), "Location not enabled, user cancelled.", Toast.LENGTH_LONG).show();
break;
}
default: {
break;
}
}
break;
}
}
protected void startLocationUpdates() {
Log.e("inside", "startlocationupdate");
// Create the location request to start receiving updates
mLocationRequest = new LocationRequest();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
// mLocationRequest.setInterval(UPDATE_INTERVAL);
/// mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
// Create LocationSettingsRequest object using location request
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(mLocationRequest);
LocationSettingsRequest locationSettingsRequest = builder.build();
Log.e("locationsettingsreuqest", String.valueOf(locationSettingsRequest));
// Check whether location settings are satisfied
// https://developers.google.com/android/reference/com/google/android/gms/location/SettingsClient
SettingsClient settingsClient = LocationServices.getSettingsClient(Main2Activity.this);
settingsClient.checkLocationSettings(locationSettingsRequest);
Log.e("locationsettingsreuqest", String.valueOf(settingsClient));
// new Google API SDK v11 uses getFusedLocationProviderClient(this)
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;
}
LocationServices.getFusedLocationProviderClient(getApplicationContext()).requestLocationUpdates(mLocationRequest, new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
onLocationChanged(locationResult.getLastLocation());
}
},
Looper.myLooper());
}
public void onLocationChanged(Location location) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
我希望它有效,否则让我知道
推荐阅读
- python - 如何在 SQL 中创建带有子标题的汇总表?
- flutter - 运行颤振医生后出错:无法找到Android SDK
- git - 如何在多个工作站之间共享 Git 别名?
- azure - 在 Azure 中监控服务
- c++ - 读取包含数据类型为 arrow::large_utf8() 的列的羽毛文件时出现分段错误
- css - 是否可以在 CSS 中组合或嵌套多个“@-rules”......在执行规则之前需要不同的“@”?
- jquery - 如果jQuery中的警报消息不相等,如何匹配两个输入值?
- xcode - 如何在构建日志中捕获 Xcode 构建后操作输出?
- c++ - 为什么即使在我输入错误后我的功能仍在继续?
- javascript - A-frame 将我的 div 中的代码镜像到 2d 平面上