Не удалось открыть : EACCES ( нет прав)

? user3613696 @ | Original: StackOverFlow
---

Я имею очень странные проблемы с хранением доступа на некоторых устройствах . Приложение работает на моем тестировании устройств ( Nexus 4 и усилителей, 7, Samsung GS5 ) . Все мои устройств под управлением Android 4.4.2 . Но я получил много писем от пользователей, говоря, чтоприложение не может написать к хранению (ни внутренней памяти, ни SD Card ). Отфайл журнала, полученные от обратной связи с пользователями, я вижу,проблема в том,следующий код:

try {
    if (fStream == null) {
    fStream = new FileOutputStream(filename, true);
}
    fStream.write(data, 0, bytes);
    return;
} catch (IOException ex) {
    ex.printStackTrace();
}

Она бросает исключение на линии fStream = новый FileOutputStream (имя файла, правда) ; при создании FileOutputStream .

Журнал стек :

W/System.err( 8147): Caused by: java.io.FileNotFoundException: /storage/emulated/0/my_folder/test_file_name.png: open failed: EACCES (Permission denied)
w/System.err( 8147):    at libcore.io.IoBridge.open(IoBridge.java:409)
W/System.err( 8147):    at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
W/System.err( 8147):    at java.io.FileOutputStream.<init>(FileOutputStream.java:128)
W/System.err( 8147):    at myapp.save(SourceFile:515)
W/System.err( 8147):    ... 8 more
W/System.err( 8147): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
W/System.err( 8147):    at libcore.io.Posix.open(Native Method)
W/System.err( 8147):    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
W/System.err( 8147):    at libcore.io.IoBridge.open(IoBridge.java:393)
W/System.err( 8147):    ... 11 more

В AndroidManifest.xml меня есть следующие разрешения заявил:

 <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/>
    <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

Я подтвердил, что пользователи, использующие частный на правильный приложения на SD- карту . И более того странно, что она не сможет записать во внутреннюю память, а также. Как это может произойти, если у меня есть и читать & Amp; права на запись ? Пользователям говорят, что они не подключается свои устройства к компьютеру в то время.

Update

Оказывается, я звоню открывать и закрывать FileOutputStream слишком часто, бросает FileNotFoundException в какой-то момент . Больше походит на вопрос распараллеливания.

---

Top 5 ответ

1Garret @

Я столкнулся с подобной проблеменекоторое время назад .

Ваша задача может быть в двух различных областях . Это либо как вы создаете файл для записи, или ваш метод написания может быть испорчен тем, что это зависит от телефона .

Если вы пишете файл в определенном месте на SD -карты, попробуйте использовать переменные среды. Они всегда должны указывать на правильное местоположение . Вотпример записи в папку загрузок :

java.io.File xmlFile = new java.io.File(Environment
    .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
     + "/Filename.xml");

Если вы пишете файл на внутреннюю память приложения. Попробуйте этот пример :

java.io.File xmlFile = new java.io.File((getActivity()
   .getApplicationContext().getFileStreamPath("FileName.xml")
   .getPath()));

Лично я полагаюсь на внешних библиотек для обработки потокового в файл. Это надо не удалось меня еще.

org.apache.commons.io.FileUtils.copyInputStreamToFile(is, file);

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

Еще одно замечание, если файлы большие, вы также можете посмотреть в запуске IO в фоновом режиме, или использовать обратные вызовы .

2ninad.sonje @

Я также столкнулся с той же проблемы. После много тяжелой работы, я обнаружил, что был неправ в моем случае. Моя устройство было подключено к компьютеру с помощью кабеля USB. Есть виды для подключения USB как Mass Storage, Media Device ( MTP ), камера (PTP ) и т.д. Мой тип соединения было - " Mass Storage ", и это было причиной проблемы . Когда я изменил тип соединения ,вопрос был решен.

Всегда помните, время доступа файловой системы на андроид устройства : -

НЕ Подключиться как Mass Storage для компьютера / шт.