2013-07-09 4 views
13

Следующий код, который состоит из загрузки файла с сервера и сохранения его в хранилище, отлично работает, когда устройство имеет внутреннее хранилище.
Но когда я попробовал это с устройством без внутреннего хранилища, только с внешним хранилищем я получаю следующее исключение.
java.io.filenotfoundexception open failed eacces (разрешение отклонено) на устройстве

java.io.FileNotFoundException Не удалось открыть EACCES (доступ запрещен)

public void downloadFile(String dlUrl, String dlName) { 
    int count; 

    HttpURLConnection con = null; 
    InputStream is = null; 
    FileOutputStream fos = null; 

    try { 
     URL url = new URL(dlUrl); 
     con = (HttpURLConnection) url.openConnection(); 
     con.setDoInput(true); 
     con.connect(); 

     is = url.openStream(); 
     String dir = Environment.getExternalStorageDirectory() + Util.DL_DIRECTORY; 
     File file = new File(dir); 
     if(!file.exists()){ 
      file.mkdir(); 
     } 

     Util.LOG_W(TAG, "Downloading: " + dlName + " ..."); 

     fos = new FileOutputStream(file + "/" + dlName); 
     byte data[] = new byte[1024]; 

     while((count = is.read(data)) != -1){ 
      fos.write(data, 0, count); 
     } 

     Util.LOG_D(TAG, dlName + " Download Complete!"); 


    } catch (Exception e) { 
     Util.LOG_E(TAG, "DOWNLOAD ERROR = " + e.toString()); 
     bServiceDownloading = false; 
    } 
    finally{ 
     try { 
      if(is != null) 
       is.close(); 
      if(fos != null) 
       fos.close(); 
      if(con != null) 
       con.disconnect(); 
     } catch (Exception e) { 
      Util.LOG_E(TAG, "CLOSE ERROR = " + e.toString()); 
     } 
    } 
} 

И в файле манифеста I имеет следующее:

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

Я попробовал много предложения в StackOverflow пока ничего не работают.
Любые предложения, что может быть причиной? Кстати Environment.getExternalStorageDirectory() возвращает/шоссе/SDCard/ и file.mkdir() возвращают ложь.

+1

попробуйте с файлом File = new File (dir + "/" + dlName); ' –

+0

результат тот же, к сожалению. Btw file.mkdir() возвращает false, вот что я думаю. @PankajKumar –

+0

Если вы отлаживаете эмулятор, убедитесь, что ваша созданная SD-карта поддерживает .. или если реальное устройство удостоверяется, что sd-карта присутствует (устройство не подключено к USB) –

ответ

13

Эта проблема, по-видимому, вызвана несколькими факторами.

Проверить # 1
Сначала добавьте это разрешение в вашем файле манифеста и проверить, если он работает:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<application> 
    ... 

</application> 

.....

Check # 2:

Если вы используете эмулятор, проверьте свойства, чтобы увидеть, есть ли у него SD-карта.

Check # 3:

Отключить передачу файлов с устройства на компьютер. Если включено, приложение не сможет получить доступ к SD-карте.

Проверка # 4:
Если все еще не работает, попробуйте следующее:

String dir = Environment.getExternalStorageDirectory().getAbsolutePath() 

Для меня следующая работал:
Проблема заключается в том, что getExternalStorageDirectory возвращается/шоссе/SDCard тогда я нужен фактический путь внешнего хранилища, который является/mnt/sdcard-ext, и в андроиде нет API, который может получить мне абсолютный путь к съемной SD-карте.
Мое решение было жестко закодировать каталог следующим образом:

String dir = "/mnt/sdcard-ext" ; 

Поскольку приложение предназначено для работы только на одном устройстве, выше сделал работу.
Если вы столкнулись с одной и той же проблемой, используйте file explorer application, чтобы узнать имя внешнего каталога и его жесткий код.

+1

Это путь к конкретному устройству (как вы упомянули). Например: я вижу здесь String dir = "/ mnt/sdcard". – hB0

+0

Какое решение вы бы предложили, если хотите получить доступ к файлу во внешнем хранилище (или нет) для ВСЕХ телефонов Android? –

+0

Что я могу сделать для проверки # 2 ответа? – Hemang

10

Используйте READ_EXTERNAL_STORAGE разрешение на чтение данных с устройства.

+1

Спасибо за ваше предложение, но, к сожалению, оно не решает проблему. –

+15

«Любое приложение, объявляющее разрешение WRITE_EXTERNAL_STORAGE, неявно предоставлено это разрешение». http://developer.android.com/reference/android/Manifest.permission.html#READ_EXTERNAL_STORAGE –

+0

Большое спасибо. Я этого не читал !!! –

6

Вы попробовали его на эмуляторе? Проверьте свойства, если у него есть SD-карта. У меня была такая же проблема, и это было потому, что у эмулятора не было SD-карты. Проверьте, есть ли у вас или нет.

+3

Facepalm. Спасибо :) –

+0

Да, я пытаюсь использовать эмулятор. Где проверить свойства, на которые вы ссылаетесь? – Hemang

4

У меня была такая же проблема, и я решил ее, отключив передачу файлов с устройства на компьютер. Потому что, если u разрешает передачу файлов, SD-карта недоступна для отладки приложения.

+0

Спасибо, это было для меня. – Lev

+1

OMG Это решило мою проблему, но прошло 3 часа в отладке –

3
try 
Environment.getExternalStorageDirectory().getAbsolutePath() 

и не забудьте добавить

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
1

Попробуйте использовать mkdirs вместо MKDIR. Если вы создаете путь к каталогу, а родительский не существует, вы должны использовать mkdirs.

0

У меня была та же проблема. Я правильно использовал права на запись и чтение в манифесте, но это не сработало! Решение было очень глупым: отключите телефон от ПК перед запуском приложения. Кажется, что когда ваш телефон подключен как «Массовое хранилище» к ПК, приложение не может получить доступ к внешнему хранилищу.

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