2014-09-30 2 views
0

я пытаюсь получить правильный путь к SD-карте, которая находится внутри моего Samsung s4 андроида устройства через мое приложение, но когда я пытаюсь вышеуказанные пути:Получить правильный путь к внешнему SDCard в Android

String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath(); 
     String pathTwo = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     String path3 = getApplicationContext().getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath(); 

It получает частный непривилегированный путь/storage/emulated/0 вместо правильного пути хранения/sdcard1

Я нашел правильный путь через File Explorer с помощью монитора Android-устройства, но я не хочу жестко кодировать путь поскольку путь может быть различным в зависимости от устройства.

вид касается

ответ

3

Основываясь на предыдущий ответ, путь к внешней SD-картам на самом деле меняется с различным устройством производства.

«Environment.getExternalStorageDirectory()» относится к тому, что изготовитель устройства считается «внешним хранилищем». На некоторых устройствах это съемный носитель, например SD-карта. На некоторых устройствах это часть встроенной вспышки. , «внешнее хранилище» означает «материал, доступный через режим USB Mass Storage при установке на хост-машине», по крайней мере для Android 1.x и 2.x. Но вопрос в том, что внешний SD. «/ mnt/sdcard/external_sd» (может отличаться от устройства к устройству)? У Android нет понятия «внешний SD», кроме внешнего хранилища, как описано выше. Если производитель устройства выбрал внешнее хранилище встроенная вспышка, а также имеет SD-карту, вам необходимо связаться с этим производителем, чтобы определить whet ее или нет, вы можете использовать SD-карту (не гарантируется) и какие правила предназначены для ее использования, например, какой путь использовать для нее ».

На основании this Ответ.

Итак, нет абсолютного способа получить этот путь через код.

1

Как упоминалось в gilonm, внешний (съемный) путь Sd варьируется от устройства к устройству, но я написал метод, который выполняет итерации по всем различным путям, которые используют разные производители, и затем находит точное совпадение.

Он возвращает пустую строку, если путь не найден. Если путь найден, вам все равно нужно проверить, вставлена ​​ли карта или нет. (Проверка наличия подпапок на этом пути)

Примечание: я использовал библиотеку StreamSupport внутри метода, поэтому вам необходимо загрузить файл jar и добавить его в папку libs вашего проекта, и это все, это Я буду работать!

public static String getExternalSdPath(Context context) { 
    List<String> listOfFoldersToSearch = Arrays.asList("/storage/", "/mnt/", "/removable/", "/data/"); 
    final List<String> listOf2DepthFolders = Arrays.asList("sdcard0", "media_rw", "removable"); 
    final List<String> listOfExtFolders = Arrays.asList("sdcard1", "extsdcard", "external_sd", "microsd", "emmc", "ext_sd", "sdext", 
      "sdext1", "sdext2", "sdext3", "sdext4"); 
    final String[] thePath = {""}; 
    Optional<File> optional = StreamSupport.stream(listOfFoldersToSearch) 
      .filter(new Predicate<String>() { 
       @Override 
       public boolean test(final String s) { 
        File folder = new File(s); 
        return folder.exists() && folder.isDirectory(); 
       } 
      }) //I got the ones that exist and are directories 
      .flatMap(new Function<String, Stream<File>>() { 
       @Override 
       public Stream<File> apply(final String s) { 
        try { 
         List<File> files = Arrays.asList(new File(s).listFiles()); 
         return StreamSupport.stream(files); 
        } catch (NullPointerException e) { 
         return StreamSupport.stream(new ArrayList<File>()); 
        } 
       } 
      }) //I got all sub-dirs of the main folders 
      .flatMap(new Function<File, Stream<File>>() { 
       @Override 
       public Stream<File> apply(final File file1) { 
        if (listOf2DepthFolders.contains(file1.getName() 
          .toLowerCase())) { 
         try { 
          List<File> files = Arrays.asList(file1.listFiles()); 
          return StreamSupport.stream(files); 
         } catch (NullPointerException e) { 
          return StreamSupport.stream(Collections.singletonList(file1)); 
         } 
        } else 
         return StreamSupport.stream(Collections.singletonList(file1)); 
       } 
      }) //Here I got all the 2 depth and 3 depth folders 
      .filter(new Predicate<File>() { 
       @Override 
       public boolean test(final File o) { 
        return listOfExtFolders.contains(o.getName() 
          .toLowerCase()); 
       } 
      }) 
      .findFirst(); 

    optional.ifPresent(new Consumer<File>() { 
     @Override 
     public void accept(final File file) { 
      thePath[0] = file.getAbsolutePath(); 
     } 
    }); 

    Log.e("Path", thePath[0]); 

    try { 
     ContextCompat.getExternalFilesDirs(context, null); 
    } catch (Exception e) { 
     Log.e("PathException", thePath[0]); 
    } 
    return thePath[0]; 
} 

P.S. Я тестировал и проверял его на нескольких устройствах HTC и Samsung.

3

Для всех устройств

String sSDpath = null; 
      File fileCur = null; 
      for(String sPathCur : Arrays.asList("MicroSD","external_SD","sdcard1","ext_card", "external_sd", "ext_sd", "external", "extSdCard", "externalSdCard")) // external sdcard 
      { 

       fileCur = new File("/mnt/", sPathCur); 
       if(fileCur.isDirectory() && fileCur.canWrite()) 
       { 
        sSDpath = fileCur.getAbsolutePath(); 
        break; 
       } 
       if(sSDpath == null) { 
       fileCur = new File("/storage/", sPathCur); 
       if(fileCur.isDirectory() && fileCur.canWrite()) 
       { 
        sSDpath = fileCur.getAbsolutePath(); 
        break; 
       } 
       } 
       if(sSDpath == null) { 
       fileCur = new File("/storage/emulated", sPathCur); 
       if(fileCur.isDirectory() && fileCur.canWrite()) 
       { 
        sSDpath = fileCur.getAbsolutePath(); 
Log.e("path",sSpath); 
        break; 
       } 
       } 
      } 

100% рабочих, протестированные на множественном устройстве.

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