Я получаю PERMISSION_DENIED для WRITE_EXTERNAL_STORAGE, который на самом деле активным:Получение разрешения отказано на Android M
Я использую библиотеку под названием 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
Не могли бы вы разместить журнал ошибок? –
Простое примечание - если вы запрашиваете разрешение на запись, вам не требуется разрешение на чтение. – slanecek
Спасибо @slanecek, я только что попробовал удалить разрешение на чтение и, по крайней мере, на устройстве, о котором я упоминал, он даже не отображает запрашиваемые разрешения в настройках приложения! – RominaV