Ответ 1
Если вы пишете содержимое на SD-карте, надеясь, что вы добавили в свой манифест android.permission.WRITE_EXTERNAL_STORAGE
Я уже немного вытягиваю волосы на это. Предполагается, что следующий метод загрузит файл и сохранит его в указанном на жестком диске месте.
private static void saveImage(Context context, boolean backgroundUpdate, URL url, File file) {
if (!Tools.checkNetworkState(context, backgroundUpdate))
return;
// Get the image
try {
// Make the file
file.getParentFile().mkdirs();
// Set up the connection
URLConnection uCon = url.openConnection();
InputStream is = uCon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
// Download the data
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
// Write the bits to the file
OutputStream os = new FileOutputStream(file);
os.write(baf.toByteArray());
os.close();
} catch (Exception e) {
// Any exception is probably a newtork faiilure, bail
return;
}
}
Кроме того, если файл не существует, он должен создать каталог для файла. (И если в этом месте есть еще один файл, он ничего не должен делать). Однако по какой-то причине метод mkdirs() никогда не создает каталог. Я пробовал все из явных круглых скобок, чтобы явно создать родительский класс файлов, и ничего не работает. Я вполне уверен, что диск доступен для записи, поскольку он только вызывается после того, как это уже определено, и это верно после выполнения его во время отладки. Таким образом, метод выходит из строя, потому что родительские каталоги не создаются. Может ли кто-нибудь сказать мне, если что-то не так с тем, как я его называю?
Кроме того, если это помогает, вот источник для файла, в который я его вызываю:
Спасибо
Если вы пишете содержимое на SD-карте, надеясь, что вы добавили в свой манифест android.permission.WRITE_EXTERNAL_STORAGE
Пожалуйста, проверьте это, это может помочь вам.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
введите разрешение в файл манифеста.
В ответ на Kevin Day есть другой способ отказа, о котором не упоминалось в предыдущих сообщениях. Даже если у вас есть android.permission.WRITE_EXTERNAL_STORAGE
в вашем манифесте, если вы пытаетесь записать на носитель, например /mnt/sdcard
, который монтируется снаружи в качестве USB-устройства (т.е. Вы подключили свое устройство как внешний диск к компьютеру с помощью USB-кабель) в то время, когда вы пытаетесь выполнить запись, тогда вы не можете записать в файловую систему /mnt/sdcard. В этом случае FILE.mkdir
вернет false. Очевидно, что если вы не проверяете код возврата, вы не увидите эту проблему, пока не получите IOException
, если попытаетесь создать файл в каталоге, который, по вашему мнению, был создан. И если вы не создадите файл в этом несуществующем каталоге, то приложение будет просто терпеть неудачу.
Я постоянно делаю эту ошибку при отладке приложений для Android - забываю, что я не могу оба установить SD-карту извне и в то же время написать свое приложение.
Вы уверены, что mkdirs не работает? Почему вы не проверяете возвращаемое значение вызова mkdirs и регистрируете сообщение об ошибке, если оно возвращает false?
if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()){
log("Unable to create " + file.getParentFile());
}
Я подозреваю, что вы можете быть удивлены тем, что было в файле...
PS - и, пожалуйста, сделайте что-нибудь с этим обработчиком ошибок - как минимум, запишите ошибку. Ловкое исключение и молчаливое возвращение - ужасная практика.