2015-02-11 2 views
0

Мое устройство - это htc один двойной sim и по какой-то причине Environment.getExternalStorageDirectory() - это моя память о телефоне, это не съемная SD-карта. Я пытался найти путь реальной сд карты с помощью этого:Найти реальный путь к SD-карте и написать файл

public static HashSet<String> getExternalMounts() { 
     final HashSet<String> out = new HashSet<String>(); 
     String reg = "(?i).*vold.*(vfat|ntfs|exfat|fat32|ext3|ext4).*rw.*"; 
     String s = ""; 
     try { 
      final Process process = new ProcessBuilder().command("mount") 
        .redirectErrorStream(true).start(); 
      process.waitFor(); 
      final InputStream is = process.getInputStream(); 
      final byte[] buffer = new byte[1024]; 
      while (is.read(buffer) != -1) { 
       s = s + new String(buffer); 
      } 
      is.close(); 
     } catch (final Exception e) { 
      e.printStackTrace(); 
     } 

     // parse output 
     final String[] lines = s.split("\n"); 
     for (String line : lines) { 
      if (!line.toLowerCase(Locale.US).contains("asec")) { 
       if (line.matches(reg)) { 
        String[] parts = line.split(" "); 
        for (String part : parts) { 
         if (part.startsWith("/")) 
          if (!part.toLowerCase(Locale.US).contains("vold")) 
           out.add(part); 
        } 
       } 
      } 
     } 
     return out; 
    } 

И я получил /мнт/media_rw/ext_sd

Я пытался записывать файлы в/мнт/media_rw/ext_sd/загрузки но файл не создается.

File file = new File("/mnt/media_rw/ext_sd/downloads", "test.txt"); 
     FileWriter writer = null; 
     try { 
      writer = new FileWriter(file); 
      writer.write("sdfsdfsfd"); 
      writer.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


02-11 23:12:35.236 9110-9110/www.jenyakirmiza.com.testsdcard W/System.err﹕ java.io.FileNotFoundException: /mnt/media_rw/ext_sd/downloads/test.txt: open failed: EACCES (Permission denied) 

Я слышал что-то о запрете, начиная с 4.4, поэтому теперь мы не можем записывать файлы на съемную SD-карту. Но они сказали, что вы можете писать в /sdcardpath/Android/data/your.package.name

ps. конечно, я добавил write_external permisssion для манифестации.

+1

Возможно, вы захотите узнать больше о том, что [внутреннее хранилище] (http://commonsware.com/blog/2014/04/07/storage-situation-internal-storage.html), [внешнее хранилище] (http://commonsware.com/blog/2014/04/08/storage-situation-external-storage.html) и [съемное хранилище] (http://commonsware.com/blog/2014/04/09/storage -situation-removeable-storage.html) означают с точки зрения Android SDK. – CommonsWare

+0

Какая честь, что вы отправили сэр на мой вопрос. Я использовал много вещей, которые вы создали. Большое вам спасибо за такой вклад в сообщество андроидов. Я прочитаю все, что вы предложили. –

ответ

1

Вы можете найти все внешние хранилища с помощью Context.getExternalMediaDirs и проверить, является ли он съемным с Environment.isExternalStorageRemovable(File). Обратите внимание, что каталог Downloads скорее всего будет только в основном (эмулированном) внешнем хранилище.

+0

плохо попробуйте. Благодарю. –

+0

есть одна проблема - эта функция появляется onlu в android api lvl 21. –

+2

Вы также можете использовать 'Context.getExternalFilesDirs' или' ContextCompat.getExternalFilesDirs', если вам также нужна поддержка старых версий Android. Чтобы проверить, удалено ли внешнее хранилище, вы можете запросить службу монтирования таким образом, что «Среда» работает, но я не уверен, что это возможно в старых версиях Android. – StenSoft

0

Попробуйте использовать Environment.getExternalStorageDirectory() метод:

File file = new File(Environment.getExternalStorageDirectory() + "/Download/", "test.txt"); 

и вы можете оценить первый, если ваш файл действительно существует с exists() способом:

File file = new File(Environment.getExternalStorageDirectory() + "/Download/", "test.txt"); 
    if(file.exists()){ 

     FileWriter writer = null; 
     try { 
      writer = new FileWriter(file); 
      writer.write("sdfsdfsfd"); 
      writer.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

Очень важно иметь это разрешение:

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

внутри вашего

AndroidManifest.xml 
+0

Я уже упоминал, что память устройства считается внешней, я хочу записать файл на съемное хранилище –

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

  • Нет связанных вопросов^_^