【问题标题】:Run-time permission and translucent overlay运行时权限和半透明覆盖
【发布时间】:2018-10-13 19:16:17
【问题描述】:

我在 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);

& in onRequestPermissionsResult 回调 if PackageManager.PERMISSION_GRANTED & requestCode == 5 我正在调用我的逻辑部分。

但是,如果我按下权限弹出窗口的 允许拒绝 按钮,我会在整个设备屏幕上获得半透明覆盖 & 除非我没有从后台杀死应用程序,否则它不会被删除。此外,设备后退按钮在这种情况下不起作用。

每次我调用WRITE_EXTERNAL_STORAGE 权限对话框并采取其中一项操作时都会发生这种情况。

如果已授予权限,则应用程序运行正常,没有任何覆盖问题。

我的minSdkVersion = 19targetSdkVersion = 27

此外,我的代码中没有 Toast 消息

我已经在 Android 7.0 中测试了该应用,并且运行良好。我在 Nexus 6P / Google Pixel 设备等 Android 8.0 设备上遇到了这个问题。

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 这也可能是因为其他应用程序。检查使用覆盖权限(如whatsapp)运行的应用程序,关闭它们。
  • @Dhananjay,我已经对此进行了测试,它对我的​​问题没有影响。感谢您的意见。

标签: android overlay android-permissions user-permissions android-8.0-oreo


【解决方案1】:

试试这个我做了两种不同的权限检查方法。

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

【讨论】:

  • 我拥有您在我的代码中提到的所有内容。我没有提到它以保持问题简单。感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多