Запись медиафайла во внутреннюю/внешнюю память

В настоящее время я пытаюсь найти способ записи медиафайла во внутреннее/внешнее хранилище (основное хранилище). Сохраняемый файл может быть любого размера от нескольких МБ до 50 МБ. У меня есть логика, которая работает на моем Droid X 2.3.3 Razr 2.3.5 (я полагаю), но не работает на моем Galaxy Nexus (у него нет съемного хранилища, но есть встроенная 16-гигабайтная карта с v4.0.2). Я осмотрелся и не нашел кода/примеров, которые работают с v4.0. Может быть, я подхожу ко всему этому неправильно, поскольку у него нет настоящей SD-карты? может быть, это что-то новое в v4.0? В настоящее время, когда я запускаю свое приложение на Galaxy Nexus, я получаю следующее: System.err(19520): java.io.FileNotFoundException:

ОБНОВЛЕНО

InputStream inputStream = urlConnection.getInputStream(); 
File PATH = Environment.getExternalStorageDirectory(); 
File FILE = new File(Environment.getExternalStorageDirectory()+ "/" + FILENAME); 
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 
// buffer int bufferSize = 1024; int bufferLength = 0; byte[] buffer = new byte[bufferSize]; 
while ((bufferLength = inputStream.read(buffer)) != -1) { 
byteBuffer.write(buffer, 0, bufferLength); 
} 
byte[] temp = byteBuffer.toByteArray(); 
FileOutputStream fos = new FileOutputStream(FILE); 
fos.write(temp); 
fos.close();

person J Man    schedule 11.01.2012    source источник


Ответы (2)


Вы помещаете этот файл в определенный каталог на SD-карте? внешнем хранилище?

Я предполагаю, что ваши разрешения в вашем манифесте хороши, потому что «отказ в разрешении не поднимается», поэтому, возможно, если вы поместите файл в определенную папку, которая не создана, вам следует вызвать функцию mkdirs() для вашего файла!

person Jeremy D    schedule 11.01.2012
comment
Значение PATH: /mnt/sdcard Должен ли я создать свой собственный каталог, а затем записывать файлы? Я предполагаю, что он не хочет, чтобы я писал в верхнюю часть памяти ?? - person J Man; 12.01.2012
comment
Хм, нет, это был просто вопрос. Итак, если вы делаете File myFile = new File(Environment.getExternalStorageDirectory()+'/'+nameFile) не работает? - person Jeremy D; 12.01.2012
comment
Нет. Если вы посмотрите на мой оригинальный пост, вы увидите мой текущий код, с которым я работаю. Я добавил то, что вы сказали, и все еще не работает. То же исключение в том же месте. Я напечатал путь к файлу журнала и выглядит правильно. - person J Man; 12.01.2012
comment
Я бы проголосовал за это, если бы мог. Создание нового каталога определенно помогло. Почему создание/не создание каталога влияет на что-либо? Я помню, как читал где-то в Android API, что это не рекомендуется, но там не говорилось, что это не сработает. На Droid X у меня всегда успешно получалось писать в самый верх большую часть внешней sd карты. - person J Man; 19.01.2012
comment
Так у вас все еще есть проблема или нет? В большинстве случаев я предпочитаю создавать определенный каталог (даже если он временный) для размещения в нем файлов, сгенерированных моим приложением. - person Jeremy D; 19.01.2012
comment
Нет, у меня нет проблемы. Ваше предложение, похоже, решило проблему. - person J Man; 19.01.2012

Во-первых, не конвертируйте его в строку, просто используйте getExternalStorageDirectory() как File:

File sd = Environment.getExternalStorageDirectory();
File file = new File(sd, FILENAME);

Не знаю, исправит это или нет, но попробовать не мешало бы. И вам не нужно вызывать file.createNewFile() перед записью в файл с FileOutputStream. Документы о FileOutputStream говорят:

Выходной поток, записывающий байты в файл. Если выходной файл существует, его можно заменить или дополнить. Если он не существует, будет создан новый файл.

И в какой строке кода происходит FileNotFoundException?

person Reed    schedule 11.01.2012
comment
InputStream inputStream = urlConnection.getInputStream(); ПУТЬ к файлу = Environment.getExternalStorageDirectory(); Файл ФАЙЛ = новый файл (ПУТЬ, ИМЯ ФАЙЛА); ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); // буфер int bufferSize = 1024; интервал буферной длины = 0; байт [] буфер = новый байт [размер буфера]; в то время как ((bufferLength = inputStream.read(buffer)) != -1) { byteBuffer.write(buffer, 0, bufferLength); } byte[] temp = byteBuffer.toByteArray(); FileOutputStream fos = новый FileOutputStream (ФАЙЛ); fos.write(temp); fos.close(); - person J Man; 12.01.2012
comment
Исключение создается в этой строке: InputStream inputStream = urlConnection.getInputStream(); - person J Man; 12.01.2012
comment
Хорошо. Так что, если это не сработает на urlConnection.getInputStream(), у вас есть ошибка в коде до того, где вы настроили URLConnection. - person Reed; 12.01.2012
comment
Понятно, но верится с трудом. Как я уже сказал, мое приложение работает на других устройствах. Я собираюсь попытаться соединить новый файловый ввод-вывод с текущей логикой urlConnection и посмотреть, что произойдет. - person J Man; 12.01.2012
comment
java.lang.OutOfMemoryError @ byteBuffer.write(buffer, 0, bufferLength); in... while ((bufferLength = inputStream.read(buffer)) != -1) { byteBuffer.write(buffer, 0, bufferLength); } - person J Man; 12.01.2012