首页 > 解决方案 > 运行时权限和半透明覆盖

问题描述

我在 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 设备上遇到此问题。

任何帮助将不胜感激。

提前致谢。

标签: androidoverlayandroid-permissionsuser-permissionsandroid-8.0-oreo

解决方案


试试这个我做了两个单独的权限检查方法。

/**
 * 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();
}

推荐阅读