2017-01-15 2 views
1

Ich habe versucht, Zugriff auf interne und externe SD-Karte in Android. Ich habe viele Codes in StackOverFlow ausprobiert, funktioniert aber nicht bei den meisten oder allen Android-Versionen. Dann habe ich zwei Lösungen gefunden. Eine, die auf Kitkat & oben arbeitet, eine andere, die auf niedriger als Kitkat arbeitet. Ich habe versucht, beide zusammenzufassen und es funktioniert!Wie bekomme ich Zugriff auf External Storage (die austauschbare SD-Karte) in Android?

Wenn jemand eine bessere Lösung als diese hat, bitte teilen.

+0

Dies teilen, um anderen zu helfen, die den Pfad der externen SD-Karte erhalten möchten –

+0

Ihre Frage sollte gemischten Code enthalten. Ihre Frage ist "Was ist der alternative Weg". Außerdem benötigen Sie manifest Berechtigungen –

+0

@ cricket_007 Ich habe vergessen, die Manifest-Berechtigungen in der Antwort hinzufügen. Und ich habe den zusammengeführten Code in die Antworten eingefügt, weil er funktioniert, da StackOverFlow eine Option hat, um Ihre eigenen Fragen zu beantworten, die ich für die beste hielt. –

Antwort

-1

Diese zwei Antworten sind, was ich zusammengeführt habe, um es zum Laufen zu bringen.

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

  2. Find an external SD card location

Hier ist die Lösung,

diese Codezeile hinzufügen in AndroidManifest.xml Erlaubnis von Android zu bekommen externe Speicher zu lesen.

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

Fügen Sie diese Klasse nun zu Ihrem Projekt hinzu.

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; 

} 
} 

nun diese Klasse zu verwenden, enthält

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(); 

String Array storages nun den Pfad des Speichers.

+0

Wenn Sie wirklich Downvote dann zumindest Kommentar warum:) Mit welchem ​​Problem sind Sie konfrontiert worden? Was war falsch in der Antwort? Vielleicht kann ich dann verbessern, was fehlt –

Verwandte Themen