2016-07-24 6 views
1

Я получаю PERMISSION_DENIED для WRITE_EXTERNAL_STORAGE, который на самом деле активным:Получение разрешения отказано на Android M

enter image description here

Я использую библиотеку под названием 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

+0

Не могли бы вы разместить журнал ошибок? –

+0

Простое примечание - если вы запрашиваете разрешение на запись, вам не требуется разрешение на чтение. – slanecek

+0

Спасибо @slanecek, я только что попробовал удалить разрешение на чтение и, по крайней мере, на устройстве, о котором я упоминал, он даже не отображает запрашиваемые разрешения в настройках приложения! – RominaV

ответ

0

Эта проблема была из-за наличия более чем один модуль с манифестом: у меня было разрешение в манифесте модуля приложения, а в другом модуле тоже.

Извлечение его из другого модуля сделало трюк.

Смежные вопросы