首先,我知道这是一个重复的问题,但是我已经查看了其他类似问题的答案,并没有成功找到任何解决方案。
我开发了一个应用程序,在我的测试设备上完美运行,该设备是Samsung S4运行Android L(5.0.1),但是我希望此应用程序也能在更新的Android版本上运行。
我知道请求权限已经改变为在Android M+中必须在运行时请求,但当我尝试实现此操作时,对话框从未出现,因此未要求所需的权限。
我请求的权限是ACCESS_FINE_LOCATION。
以下是来自我的清单文件的相关代码:
正如我所说的那样,要求权限的对话框从未出现,但是我的控制台告诉我调用了
谢谢。
编辑
所以我刚刚在一个全新的项目中测试了我发布在这里的代码,它运行得很好并显示了对话框。我现在真的很困惑,不知道什么阻止了该对话框在我的当前项目中显示。
我开发了一个应用程序,在我的测试设备上完美运行,该设备是Samsung S4运行Android L(5.0.1),但是我希望此应用程序也能在更新的Android版本上运行。
我知道请求权限已经改变为在Android M+中必须在运行时请求,但当我尝试实现此操作时,对话框从未出现,因此未要求所需的权限。
我请求的权限是ACCESS_FINE_LOCATION。
以下是来自我的清单文件的相关代码:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
如果权限尚未被授予,我会在哪里请求权限:
if (ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
startGeofenceMonitoring();
} else {
askForPermission(android.Manifest.permission.ACCESS_FINE_LOCATION,LOCATION);
}
askForPermission函数(略有修改自谷歌的例子):
private void askForPermission(String permission, Integer requestCode) {
if (ContextCompat.checkSelfPermission(MapsActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(MapsActivity.this, permission)) {
//This is called if user has denied the permission before
//In this case I am just asking the permission again
ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
} else {
Log.d(TAG, "askForPermission: " + permission);
ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
}
} else {
Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
}
}
而onRequestPermissionsResult函数:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.d(TAG, "onRequestPermissionsResult: " + requestCode);
switch (requestCode) {
case 1:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "onRequestPermissionsResult: request");
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
startGeofenceMonitoring();
}
break;
}
}
正如我所说的那样,要求权限的对话框从未出现,但是我的控制台告诉我调用了
ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
,经过大量研究,我仍然不确定为什么它不起作用。我认为唯一可能的原因是此Activity是一个Fragment activity,显示谷歌地图。我确实尝试在另一个activity中请求权限,但发生完全相同的情况。谢谢。
编辑
所以我刚刚在一个全新的项目中测试了我发布在这里的代码,它运行得很好并显示了对话框。我现在真的很困惑,不知道什么阻止了该对话框在我的当前项目中显示。