2016-09-27 5 views
0

Я пробовал почти все решения, чтобы получить список путей хранения, включая How can I get external SD card path for Android 4.0+?. Но ничто не возвращает сменный путь к SD-карте.Получить все пути хранения в Android

И, наконец, я пробовал с "/mnt/". Это возвращает все пути хранения, включая некоторые другие пути. Но я хочу только пути хранения. Как я мог это достичь? Есть ли способ определить, является ли данный путь путь хранения, или есть лучший способ получить все пути хранения в Android.

+0

Поскольку мы не знаем, что вы пробовали, сложно предложить что-то новое. – greenapps

+0

На каких версиях Android должен работать ваш код? – greenapps

+0

@greenapps Я пробовал все решения из http://stackoverflow.com/questions/11281010/how-can-i-get-external-sd-card-path-for-android-4-0/13648873#13648873. И мой код работает от KitKat. – Gunaseelan

ответ

1

Вы можете использовать этот класс для получения всего доступного хранилища на Android-телефоне. Этот код взят из stackoverflow.com, но содержит некоторую ошибку. Я удаляю ошибку, и этот код протестирован на Android 6 и Android 7.

public class StorageUtils { 

    private static final String TAG = "StorageUtils"; 

    public static class StorageInfo { 

     public final String path; 
     public final boolean readonly; 
     public final boolean removable; 
     public final int number; 
     StorageInfo(String path, boolean readonly, boolean removable, int number) { 
      this.path = path; 
      this.readonly = readonly; 
      this.removable = removable; 
      this.number = number; 
     } 

     public String getDisplayName() { 
      StringBuilder res = new StringBuilder(); 
      if (!removable) { 
       res.append("Internal Storage"); 
      } else if (number > 1) { 
       res.append("SD card " + number); 
      } else { 
       res.append("SD card"); 
      } 
      if (readonly) { 
       res.append(" (Read only)"); 
      } 
      return res.toString(); 
     } 
    } 

    public static List<StorageInfo> getStorageList() { 

     List<StorageInfo> list = new ArrayList<StorageInfo>(); 
     String def_path = Environment.getExternalStorageDirectory().getPath(); 
     boolean def_path_removable = Environment.isExternalStorageRemovable(); 
     String def_path_state = Environment.getExternalStorageState(); 
     boolean def_path_available = def_path_state.equals(Environment.MEDIA_MOUNTED) 
       || def_path_state.equals(Environment.MEDIA_MOUNTED_READ_ONLY); 
     boolean def_path_readonly = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY); 

     HashSet<String> paths = new HashSet<String>(); 
     int cur_removable_number = 1; 

     if (def_path_available) { 
      paths.add(def_path); 
      list.add(0, new StorageInfo(def_path, def_path_readonly, def_path_removable, def_path_removable ? cur_removable_number++ : -1)); 
     } 

     BufferedReader buf_reader = null; 
     try { 
      buf_reader = new BufferedReader(new FileReader("/proc/mounts")); 
      String line; 
      while ((line = buf_reader.readLine()) != null) { 

       if (line.contains("vfat") || line.contains("/mnt") || line.contains("sdcardfs")) { 
        Log.d(TAG, line); 
        StringTokenizer tokens = new StringTokenizer(line, " "); 
        String mPath = tokens.nextToken(); //device 
        String mount_point = tokens.nextToken(); //mount point 
        if (paths.contains(mount_point)) { 
         continue; 
        } 
        String unused = tokens.nextToken(); //file system 
        List<String> flags = Arrays.asList(tokens.nextToken().split(",")); //flags 
        boolean readonly = flags.contains("ro"); 

         if (!line.contains("/mnt/secure") 
           && !line.contains("/mnt/asec") 
           && !line.contains("/mnt/obb") 
           && !line.contains("/dev/mapper") 
           && !line.contains("tmpfs")) { 
          File testFile = new File(mount_point); 
          if(testFile.isDirectory() && testFile.listFiles() != null) { 
           paths.add(mount_point); 
           list.add(new StorageInfo(mount_point, readonly, true, cur_removable_number++)); 
          } 
         } 
       } 
      } 

     } catch (FileNotFoundException ex) { 
      ex.printStackTrace(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } finally { 
      if (buf_reader != null) { 
       try { 
        buf_reader.close(); 
       } catch (IOException ex) {} 
      } 
     } 
     return list; 
    } 
} 

Надеюсь, эта помощь.

+0

Я проверю этот ответ иногда позже .. Спасибо. Добавлено +1. – Gunaseelan

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