FileNotFoundException: /storage/sdcard0/Myfile.txt: ошибка открытия: EACCES (разрешение отклонено) - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь записать файл в папку вне приложения, во внешнем хранилище.Я добавил разрешение WRITE_EXTERNAL_STORAGE в манифест.

Здесь есть похожие ошибки в stackoverflow, но после попытки решения (как вы увидите в моих следующих строках) у меня та же ошибка.

Я попробовал это в обоих эмуляторах с Nexus 5X api 27 oreo rom, а также в реальном телефоне Huawei с Android 4.4

В обоих устройствах у меня одна и та же ошибка:

FileNotFoundException: /storage/sdcard0/Myfile.txt: open failed: EACCES (Permission denied)

Этомой код:

    String content = "hello world";
    File file;
    FileOutputStream outputStream;
    try {
        file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "MyFile.txt");
        outputStream = new FileOutputStream(file);
        outputStream.write(content.getBytes());
        outputStream.close();
    } catch (IOException e) {
        Toast.makeText(context, e.toString(), Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }

манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myapp">

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />

<uses-feature
    android:name="android.hardware.camera.autofocus"
    android:required="false" />
<uses-feature
    android:name="android.hardware.camera"
    android:required="false" />
<uses-feature
    android:name="android.hardware.telephony"
    android:required="false" />
<uses-feature
    android:name="android.hardware.location"
    android:required="false" />
<uses-feature
    android:name="android.hardware.location.gps"
    android:required="false" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity
        android:name=".activities.Activity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Просто попробуйте запросить разрешение с помощью этого кода:

private void requestPermission() {
    ActivityCompat.requestPermissions(getActivity() ,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE ,
                    Manifest.permission.READ_EXTERNAL_STORAGE} ,
            PERMISSION_READ_WRITE_REQUEST_CODE);
}

PERMISSION_READ_WRITE_REQUEST_CODE - это пользовательская переменная, по-моему, 34.

И обработайте ее в

 @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode){
        case PERMISSION_READ_WRITE_REQUEST_CODE : {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
                  //yeee permission granted
            }
        }
    }
}
0 голосов
/ 02 июня 2018

Наконец вчера я обнаружил то же самое, что CommonsWare прекрасно объяснил в комментариях:

Избавьтесь от android: maxSdkVersion = "18".Это допустимо, только если вы используете getExternalFilesDir (), getExternalCacheDir () и аналогичные методы в Context.Вы используете Environment.getExternalStorageDirectory (), поэтому вам всегда нужно WRITE_EXTERNAL_STORAGE

0 голосов
/ 01 июня 2018

Для устройств с Android> = 6.0 необходимо запрашивать разрешения во время выполнения

Для android 4, добавляя android:maxSdkVersion="18", генерировать это исключение, попробуйте удалить его

РЕДАКТИРОВАТЬ : для Android 4.4 и выше, вы НЕ WRITE_EXTERNAL_STORAGE ЕСЛИ ТОЛЬКО вы хотите записать на внешнее хранилище, из документа:

начиная с Android 4.4 (уровень API 19), вашему приложению больше не нужно запрашивать разрешение WRITE_EXTERNAL_STORAGE, когда ваше приложение хочет выполнять запись в свои собственные каталоги приложений на внешнем хранилище (каталоги, предоставляемые getExternalFilesDir ())

Иначе, для Android <4.4, вам необходимо добавить <code>android:maxSdkVersion="18" для собственных каталогов для приложений на внешнем хранилище

...