Невозможно записать на SD-карту даже с установленными разрешениями и внешним хранилищем в состоянии MEDIA_MOUNTED

При попытке записать файл на sdcard я получаю исключение java.io.FileNotFoundException: /filename (Read-only file system) . К сожалению, ни одно из многочисленных решений, опубликованных здесь, не помогло мне. Я установил разрешения, а внешнее хранилище находится в состоянии MEDIA_MOUNTED. Это проблемный код:

 Log.i("STORAGE", Environment.getExternalStorageState()); OutputStream fos = new FileOutputStream(Helpers.StripExtension(filePath) + ".blk"); fos.write(digest.getBytes()); fos.close(); 

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

Manifest:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mypackagename" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="15" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" android:theme="@android:style/Theme.Black" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> 

Logcat:

  10-25 18:24:34.330: I/FILEPATH(1989): /mnt/sdcard/Untitled.txt 10-25 18:24:34.360: I/STORAGE(1989): mounted 10-25 18:24:34.360: W/System.err(1989): java.io.FileNotFoundException: /mnt/sdcard/Untitled.blk (Read-only file system) 10-25 18:24:34.360: W/System.err(1989): at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method) 10-25 18:24:34.360: W/System.err(1989): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232) 10-25 18:24:34.360: W/System.err(1989): at java.io.FileOutputStream.<init>(FileOutputStream.java:94) 10-25 18:24:34.360: W/System.err(1989): at java.io.FileOutputStream.<init>(FileOutputStream.java:165) 10-25 18:24:34.360: W/System.err(1989): at java.io.FileOutputStream.<init>(FileOutputStream.java:144) 

Я запускаю это на реальном устройстве, а не avd. Я попытался перезагрузить мое устройство и перестроить проект. Такие приложения, как OfficeSuite, могут без проблем записывать в это место.

Устройство: ZTE Blade с Android 2.3.7 (CyanogenMod 7)

Попробуй это:

 File file = new File(Helpers.StripExtension(filePath) + ".blk"); file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); fos.write(digest.getBytes()); fos.close(); 

И если это не сработает, я думаю, что у вас может возникнуть проблема при чтении из исходного файла ( digest.getBytes() ). Опубликуйте немного больше кода, и мы можем пойти оттуда

Редактировать:

Если это не позволяет вам писать в выбранный каталог, попробуйте протестировать путь следующим образом:

 File file = new File(Environment.getExternalStorageDirectory() + "test_file.blk"); 

Он должен работать нормально, и вы, вероятно, просто не имеете права на запись в каталог, который используете.

Попробуй это:

 File file = new File(filePath); File parent = file.getParentFile(); if (!parent.exists() && !parent.mkdirs()) { return; } file = new File(Helpers.StripExtension(filePath) + ".blk"); OutputStream fos = new FileOutputStream(file); fos.write(digest.getBytes()); fos.close(); 

Отлично, у меня была такая же проблема некоторое время назад. Ограничитель маршрута (или то, что он называется) отсутствует.

 File file = new File(Environment.getExternalStorageDirectory() + "test_file.blk"); 

Не работает, но

 File file = new File(Environment.getExternalStorageDirectory() + "/test_file.blk"); 

Хорошо работает

Также:

 FileWriter f = new FileWriter(Environment.getExternalStorageDirectory().getPath()+ "/foobar"); f.append("stuff"); f.close(); 

Прекрасно работает.
Я думаю, что исключения говорят, что это только чтение, потому что корневая файловая система действительно действительно.

ЗАМЕТКА:
java.io.FileNotFoundException: /foobar (Read-only file system) означает, что мы пишем системный корень
java.io.FileNotFoundException: /mnt/sdcard/foobar (Read-only file system) означает sdcard root (я не получил это исключение, это просто пример)

Tl; dr неправильный путь

Intereting Posts
Android как сохранить большой список <String > во время запуска приложения Как плитку и прокрутку большого изображения (10000×10000) в android Должен ли я объявлять разрешение «com.android.alarm.permission.SET_ALARM» при использовании Alarm Manager в Android? Получить сгенерированный идентификатор после вставки Начать PendingIntent для результата Лямбда-выражения не поддерживаются -source 1.7 (Android Studio) Почему Android XmlPullParser ДЕЙСТВИТЕЛЬНО замедляется на моем более старом устройстве? Не получать уведомление Студия Android getSlotFromBufferLocked: неизвестная ошибка буфера AlarmManager запускает PendingIntent слишком рано Добавить прогресс в нижней части списка Android ScrollView не работает должным образом Gradle строит очень медленно с многопроектной структурой Отрегулируйте панорамирование | отрегулируйте размер doen't, похоже, работайте над JellyBean 4.2.2-4.1.2 Редактирование css на странице настроек для веб-приложения на Android