2015-07-30 3 views
8

Как видно из названия, у меня возникают проблемы с записью файлов во внешнее хранилище. Мое устройство отладки - это Nexus 5. Дело в том, что я могу отлично читать файлы с устройства (я пытался с ними в папке загрузки), но не могу их записать. Я знаю, что должен сделать это, пока устройство не подключено к компьютеру. Но это тоже не работает.Запись файлов на внешнее хранилище в Android с ошибкой

На самом деле, я пробовал читать состояние SD-карты перед тем, как писать (конечно, не работает). Состояние показало, что «смонтировано» либо при подключении устройства к компьютеру, либо нет. И я сравнил состояние с Environment.MEDIA_MOUNTED_READ_ONLY и Environment.MEDIA_MOUNTED без каких-либо успехов. Мое устройство ни в одном из этих состояний.

Одна вещь, о которой вы должны знать, это то, что на моем телефоне нет внешней SD-карты, поскольку она является внутренней. Это приводит к тому, что мое устройство имеет каталог «/ storage/emulated/0/...» для внешнего хранилища.

Я должен также отметить, что я реализовал следующие теги в моей Android Manifest:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE"/> 

Я не имею никакого понятия, что могло бы быть. Еще одна вещь, которая может помочь, заключается в том, что я пытался управлять файлами с помощью winrar (для Android), и мне удалось удалить файлы с устройства, подключенного к моему ПК, а также без его подключения. Поэтому я не знаю, что делать.

Код, который я использую для записи файла, следующий. Имейте в виду, что он должен прочитать файл (что он делает), преобразовать его в строку, преобразовать его обратно в изображение, а затем сохранить его в папку Загрузки:

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + "/base_image.jpg"); 
// Reading a Image file from file system 
FileInputStream imageInFile = new FileInputStream(file); 
byte imageData[] = new byte[(int) file.length()]; 
imageInFile.read(imageData); 

// Converting Image byte array into Base64 String 
String imageDataString = encodeImage(imageData); 

// Converting a Base64 String into Image byte array 
byte[] imageByteArray = decodeImage(imageDataString); 

File newFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "converted_image.jpg"); 

//Write a image byte array into file system 
FileOutputStream imageOutFile = new FileOutputStream(newFile); 

imageOutFile.write(imageByteArray); 

imageInFile.close(); 
imageOutFile.close(); 

Что я должен делать?

+0

Вы уверены, что файл выходит на него? – Raghunandan

+0

Я создаю новый файл. Или, по крайней мере, это то, что я пытаюсь. Я получаю исключение File Not Found Exception при попытке создать его и ошибку EACCES (Permission denied). Это моя главная проблема. Я делаю что-то неправильно? – blastervla

ответ

4

Просто исправить ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE до android.permission.WRITE_EXTERNAL_STORAGE в вашем uses-permission.

Я столкнулся с этой проблемой, разрешение UPPERCASE не является полезным.

+1

Я не могу поблагодарить вас за ваш ответ. Это беспокоило меня в течение нескольких дней. Огромное спасибо!! – blastervla

3

FileOutputStream НЕ автоматически создает файл, если он не существует.

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

if(!newFile.exists()) { 
    newFile.createNewFile(); 
} 

Надеюсь, что эта помощь!

+0

Спасибо за быстрый ответ. Я попробовал это, но теперь это бросает мне следующее исключение: «java.io.IOException: open failed: EACCES (Permission denied)», когда я вызываю «newFile.createNewFile();» метод. Любые идеи о том, что может произойти? – blastervla

+1

Также перед вызовом createFile() вызовите этот 'newFile.getParentFile(). Mkdirs()'. Постскриптум извините, если его неправильно, я уйду с вершины моей головы :) – vedi0boy

+0

Хорошо, ну, очевидно, я не дал вашему приложению надлежащие разрешения, могу ли я увидеть, где в манифесте, что u добавил разрешения. Изменить: Удалено последнее утверждение, это было неправильно. – vedi0boy

Смежные вопросы