android - 运行时权限和半透明覆盖
问题描述
我在 Android 8.0 上面临屏幕覆盖问题。下面提到的是我的 manifest.xml 文件中提到的权限 -
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
在按钮单击(按钮在片段内)时,我正在检查是否WRITE_EXTERNAL_STORAGE
授予权限。如果没有被批准,我正在做以下事情 -
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 5);
& 在onRequestPermissionsResult
回调中,如果PackageManager.PERMISSION_GRANTED
&requestCode == 5
我正在调用我的逻辑部分。
但是,如果我按下权限弹出窗口的允许或拒绝按钮中的任何一个,我会在整个设备屏幕上获得半透明覆盖,除非我没有从后台杀死应用程序,否则它不会被删除。此外,设备后退按钮在这种情况下不起作用。
每次我调用WRITE_EXTERNAL_STORAGE
权限对话框并采取其中一项操作时都会发生这种情况。
如果已授予权限,则应用程序运行良好,没有任何覆盖问题。
我的minSdkVersion = 19
& targetSdkVersion = 27
。
此外,我的代码中没有 Toast 消息。
我已经在 Android 7.0 中测试了该应用程序,并且运行良好。我在 Nexus 6P / Google Pixel 设备等 Android 8.0 设备上遇到此问题。
任何帮助将不胜感激。
提前致谢。
解决方案
试试这个我做了两个单独的权限检查方法。
/**
* this method request to permission asked.
*/
private void requestPermissions() {
boolean shouldProvideRationale =
ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (shouldProvideRationale) {
} else {
Log.i("Error", "Requesting permission");
// previously and checked "Never ask again".
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_PERMISSIONS_REQUEST_CODE);
}
}
/**
* this method check permission and return current state of permission need.
*/
private boolean checkPermissions() {
int permissionState = ActivityCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
return permissionState == PackageManager.PERMISSION_GRANTED;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
if (grantResults.length <= 0) {
// If user interaction was interrupted, the permission request is cancelled and you
// receive empty arrays.
Log.i("Error", "User interaction was cancelled.");
} else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission was granted. Kick off the process of building and connecting
// GoogleApiClient.
getCallDetails();
} else {
}
}
}
然后在像这样检查主要活动之后。
if (!checkPermissions()) {
requestPermissions();
} else {
getWrite();
}
推荐阅读
- javascript - 返回导出模块的最佳方式
- vue.js - Vuejs - 如何使用 v-for 获取数组中的所有唯一值(删除重复项)
- scala - Scala 不能转换类型 Publisher[Publisher[_ <: T]] 不能应用于 (Flux[Flux[String]]
- django - 如何使用 Keycloak Token 获取权限列表
- python - 如何取消制表符(-1 制表符)?
- kubernetes - 如果命令返回码非零,如何终止 kubernetes 作业
- excel - VBA 帮助 - 通过调用函数运行 3 个宏的脚本不会运行所有宏
- rest - 在 Oracle APEX AJAX On demand 过程中调用 POST Web 服务
- spring - Spring boot(数据 jpa)我无法将 eumn 值保存在数据库中
- java - 为什么不安全的双重检查锁定可以返回空值?