在 Android M 上获得权限被拒绝

Getting permission denied on Android M

我得到 PERMISSION_DENIED 的 WRITE_EXTERNAL_STORAGE 实际上是活跃的:

我正在使用一个名为 Permiso 的库来检索它们:

private void attemptStartImagePicker() {
    Permiso.getInstance().requestPermissions(new Permiso.IOnPermissionResult() {
        @Override
        public void onPermissionResult(Permiso.ResultSet resultSet) {
            if (!resultSet.isPermissionGranted(Manifest.permission.READ_EXTERNAL_STORAGE) || !resultSet.isPermissionGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                showErrorDialog(getString(R.string.change_profile_image_permission_denied));
            } else {
                startImagePicker();
            }
        }

        @Override
        public void onRationaleRequested(final Permiso.IOnRationaleProvided callback, String... permissions) {
            Permiso.getInstance().showRationaleInDialog(getString(R.string.grant_access), getString(R.string.change_profile_image_rationale), null, new Permiso.IOnRationaleProvided() {
                @Override
                public void onRationaleProvided() {
                    callback.onRationaleProvided();
                }
            });
        }
    }, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE);
}

我也试过文档中的代码:

private void requestWritePermission() {
    // Here, thisActivity is the current activity
    if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    PERMISSIONS_REQUEST_WRITE_EXTERNAL);
            // PERMISSIONS_REQUEST_WRITE_EXTERNAL is an
            // app-defined int constant. The callback method gets the
            // result of the request.
    } else {
        startImagePicker();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSIONS_REQUEST_WRITE_EXTERNAL: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted
                startImagePicker();
            } else {
                // permission denied
                showErrorDialog(getString(R.string.change_profile_image_permission_denied));
            }
            return;
        }
    }
}

在这两种情况下,我都知道 READ_EXTERNAL_STORAGE 已启用,但 WRITE_EXTERNAL_STORAGE 未启用!

清单的相关部分:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.nothereal.packagename"
    android:minSdkVersion="16"
    android:targetSdkVersion="23"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

gradle的相关部分:

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.3'
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        // Enabling multidex support.
        multiDexEnabled true
    }
}

dependencies {    
        compile 'com.android.support:multidex:1.0.0'
        compile 'com.android.support:appcompat-v7:23.0.3'
        compile 'com.android.support:design:24.1.0'
        compile 'com.android.support:support-v13:24.1.0'
        compile 'com.android.support:recyclerview-v7:23.0.3'
        compile 'com.android.support:support-v4:23.0.3'
        compile 'com.android.support:cardview-v7:23.0.3'

在 Nexus 5X 上测试 Android 版本 6.0.1

这个问题是由于有多个模块带有清单:我在我的应用程序模块清单中获得了许可,而另一个模块也拥有它。

将它从另一个模块中删除就可以了。