2017-01-15 8 views
1

Я пытался получить доступ к внутренней и внешней SD-карте в Android. Я пробовал много кодов, доступных в StackOverFlow, но не работает на большинстве или на всех версиях Android. Затем я нашел два решения. Один, который работает на Kitkat & выше, другой, который работает на более низком, чем Kitkat. Я пытался объединить их обоих, и это работает!Как получить доступ к внешнему хранилищу (съемной SD-карте) в Android?

Если у кого-то есть лучшее решение, пожалуйста, поделитесь.

+0

Разделите это, чтобы помочь другим, кто хочет получить путь к внешней SD-карте –

+0

Ваш вопрос должен содержать объединенный код. Ваш вопрос: «Каков альтернативный путь». Кроме того, вам нужны разрешения манифеста –

+0

@ cricket_007 Я забыл о добавлении разрешений манифеста в ответ. И я ввел объединенный код в ответы, потому что он работает, поскольку StackOverFlow имеет возможность ответить на ваши собственные вопросы, я думал, что это будет лучше всего. –

ответ

-1

Эти два ответа - это то, что я объединил, чтобы заставить его работать.

  1. How to get SD_Card path in android6.0 programmatically

  2. Find an external SD card location

Вот решение,

Добавьте эту строку кода в AndroidManifest.xml, чтобы получить разрешение от Android для чтения внешних хранилищ.

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

Теперь добавьте этот класс в свой проект.

public class StoragePath { 
File[] getExternalFilesDirs; 

/** 
* Constructor for KitKat & above 
* @param getExternalFilesDirs 
*/ 
public StoragePath(File[] getExternalFilesDirs) { 
    this.getExternalFilesDirs = getExternalFilesDirs; 
} 

/** 
* Constructor for lower than Kitkat 
* 
*/ 
public StoragePath() { 

} 

public String[] getDeviceStorages() { 
    List<String> results = new ArrayList<>(); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //Method 1 for KitKat & above 
     File[] externalDirs = getExternalFilesDirs; 

     for (File file : externalDirs) { 
      String path = file.getPath().split("/Android")[0]; 

      boolean addPath = false; 

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
       addPath = Environment.isExternalStorageRemovable(file); 
      } else { 
       addPath = Environment.MEDIA_MOUNTED.equals(EnvironmentCompat.getStorageState(file)); 
      } 

      if (addPath) { 
       results.add(path); 
      } 
     } 
    } 

    if (results.isEmpty()) { //Method 2 for all versions 
     final List<String> out = new ArrayList<>(); 
     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); 
        } 
       } 
      } 
     } 
     results.addAll(out); 
    } 

    //Below few lines is to remove paths which may not be external memory card, like OTG (feel free to comment them out) 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     for (int i = 0; i < results.size(); i++) { 
      if (!results.get(i).toLowerCase().matches(".*[0-9a-f]{4}[-][0-9a-f]{4}")) { 
       Log.d("Tag", results.get(i) + " might not be extSDcard"); 
       results.remove(i--); 
      } 
     } 
    } else { 
     for (int i = 0; i < results.size(); i++) { 
      if (!results.get(i).toLowerCase().contains("ext") && !results.get(i).toLowerCase().contains("sdcard")) { 
       Log.d("Tag", results.get(i) + " might not be extSDcard"); 
       results.remove(i--); 
      } 
     } 
    } 

    //Get path to the Internal Storage aka ExternalStorageDirectory 
    final String internalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    results.add(0, internalStoragePath); 

    String[] storageDirectories = new String[results.size()]; 
    for (int i = 0; i < results.size(); ++i) storageDirectories[i] = results.get(i); 

    return storageDirectories; 

} 
} 

Теперь, чтобы использовать этот класс,

StoragePath storagePath; 
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
     storagePath = new StoragePath(getExternalFilesDirs(null)); 
}else { 
     storagePath = new StoragePath(); 
} 

String[] storages; 
storages = storagePath.getDeviceStorages(); 

Строка массива storages теперь содержит путь хранилищ.

+0

Если вам действительно нужно понизить, то, по крайней мере, прокомментируйте, почему так:) С какой проблемой вы столкнулись? Что было не так в ответе? Может быть, тогда я смогу улучшить то, чего не хватает –

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

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