Это касается новой модели runtime permissions introduced in Android Marshmallow при запросе разрешения Manifest.permission.WRITE_EXTERNAL_STORAGE
.Запрос и разрешение WRITE_EXTERNAL_STORAGE во время выполнения не влияет на текущий сеанс
Короче, что я испытываю, что если я прошу (и пользователь разрешает) Manifest.permission.WRITE_EXTERNAL_STORAGE
разрешения, приложение не будет иметь возможности читать и не писать из внешнего каталога хранения, пока я уничтожить и перезапустить приложение ,
Это то, что я делаю/испытывать:
Мое приложение запускается из состояния, где:
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
Это, я не имею права на доступ к внешним хранения.
Затем я прошу разрешения Manifest.permission.WRITE_EXTERNAL_STORAGE так же, как Google объясняет
private void requestWriteExternalStoragePermission() {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
new AlertDialog.Builder(this)
.setTitle("Inform and request")
.setMessage("You need to enable permissions, bla bla bla")
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(MendeleyActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, RC_PERMISSION_WRITE_EXTERNAL_STORAGE);
}
})
.show();
} else {
ActivityCompat.requestPermissions(MendeleyActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, RC_PERMISSION_WRITE_EXTERNAL_STORAGE);
}
}
После того как пользователь дает разрешение, onRequestPermissionsResult
получает вызывается.
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case RC_PERMISSION_WRITE_EXTERNAL_STORAGE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && PackageManager.PERMISSION_GRANTED
// allowed
} else {
// denied
}
break;
}
}
}
allowed
блока выполняется, подтверждая пользователь предоставил разрешение.
Немедленно после этого, если я не уничтожу и не открою приложение снова, у меня все еще нет доступа к внешнему хранилищу. Более конкретно:
hasWriteExternalStoragePermission(); // returns true
Environment.getExternalStorageDirectory().canRead(); // RETURNS FALSE!!
Environment.getExternalStorageDirectory().canWrite(); // RETURNS FALSE!!
Таким образом, кажется, что Android выполнения думает, что есть права доступа, но файловая система не ... Действительно, пытаясь получить доступ к Environment.getExternalStorageDirectory()
бросает исключение:
android.system.ErrnoException: open failed: EACCES (Permission denied)
at libcore.io.Posix.open(Native Method)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
at libcore.io.IoBridge.open(IoBridge.java:438)
at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
Если я теперь уничтожу приложение и снова открою его, поведение будет таким, каким оно есть, имея возможность читать и писать во внешней папке хранилища.
Есть ли у кого-нибудь это?
Я использую один официальный эмулятор с:
- Последние Android 6,0 (API 23) API 23, Rev 1.
- Эмулятор работает Intel x86 Atom System Image, API 23, Rev 1.
Я строю приложение с:
android {
compileSdkVersion 23
buildToolsVersion "22.0.1"
defaultConfig {
minSdkVersion 16
targetSdkVersion 23
}
...
}
Если кто-то подтверждает это, и я не только один я гу ess, нам нужно будет открыть ошибку, но я надеюсь, что что-то сделаю неправильно, так как я думаю, что такая базовая функция вряд ли будет ошибкой в SDK.
«Кто-нибудь испытывает это?» - Я не, но я не пробовал это на эмуляторе. Я использую оборудование. – CommonsWare
Тогда это, скорее всего, будет только на эмуляторе ... Я обновлю, когда получу обновление Android M. – GaRRaPeTa
https://code.google.com/p/android-developer-preview/issues/detail?id=2982 – greywolf82