java - 请求多个权限时Android权限被拒绝
问题描述
我需要在两个单独的请求中向用户询问 GPS 和文件系统权限。
预期行为:应用程序显示对 GPS 权限的请求,在用户做出决定后,应用程序将显示文件系统权限请求并让用户再次决定。
实际行为:仅显示对 GPS 权限的请求,并且文件系统权限被自动拒绝而不显示任何对话框。
目标 Android 版本: 5.0 及更高版本(API 21+)
有人可以告诉我如何解决这个问题吗?先感谢您!
我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
checkLocationPermissions();
checkLoggingPermissions();
...
...
}
private void checkLoggingPermissions() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "Requesting filesystem permissions from user");
ActivityCompat.requestPermissions(this, new String[]
{Manifest.permission.WRITE_EXTERNAL_STORAGE},
FrontendConstants.PERMISSION_FILESYSTEM_REQUEST_CODE);
}
else {
LoggingService.init();
}
}
else {
LoggingService.init();
}
}
private void checkLocationPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "Requesting GPS permissions from user");
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.INTERNET
}, FrontendConstants.PERMISSION_GPS_REQUEST_CODE);
}
else {
locationService = LocationService.getInstance(this);
}
}
else {
locationService = LocationService.getInstance(this);
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
if(FrontendConstants.PERMISSION_GPS_REQUEST_CODE == requestCode) {
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.e(TAG, "+++ User accepted GPS permission request");
locationService = LocationService.getInstance(this);
}
else {
Log.e(TAG, "--- User rejected GPS permission request");
}
}
if(FrontendConstants.PERMISSION_FILESYSTEM_REQUEST_CODE == requestCode) {
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.e(TAG, "+++ User accepted filesystem permission request");
LoggingService.init();
}
else {
Log.e(TAG, "--- User rejected filesystem permission request");
}
}
}
解决方案
理想情况下,您会在一个请求中执行此操作,以便为用户和您简化事情。
话虽如此,要获得您正在寻找的流量,请checkLoggingPermissions()
从两个地方致电:
来自
checkLocationPermissions()
,如果用户已经从您的应用程序的某些过去运行中授予了这些权限(即,在您拥有的分支中locationService = LocationService.getInstance(this);
)From
onRequestPermissionsResult()
,如果用户刚刚授予了位置权限
而且,正如 Pawel 提到的那样, remove Manifest.permission.INTERNET
,因为它是一种normal
权限,不需要运行时验证。
推荐阅读
- linux - 在启动脚本 debian 中更改目录
- python - 获取过去三个月每个月的前 5 名用户 Django
- kotlin - 如何将数据/对象从片段传递到kotlin中的活动
- python - Python 中带有 LIGHTTPD 的 FastCGI
- node.js - 将 MongoDB 与部署在 Elastic Beanstalk 上的 NodeJS 应用程序一起使用的推荐方法是什么?
- java - 以编程方式连接到 Wifi AP 时的密码验证
- azure-keyvault - 将受 HSM 保护的密钥导入 Azure Key Vault
- node.js - Node JS / Angular - 使用 Node JS 或 Angular 进行 Windows 活动目录身份验证
- node.js - 找不到模块“./driver”
- python - 通过 python 的 ssh socks5 客户端不起作用