web-dev-qa-db-de.com

Externer SDCard-Dateipfad für Android

Stimmt es, dass der Dateipfad zur externen SD-Karte auf Android-Geräten immer "/ storage/extSdCard" ist? Wenn nicht, wie viele Variationen gibt es?

Ich brauche es für meine App, um die Verfügbarkeit von external SDCard zu testen.

Ich verwende Titanium, es hat eine MethodeTitanium.Filesystem.isExternalStoragePresent () Aber es wird immer true zurückgegeben, auch wenn keine externe SD-Karte installiert ist. 

Ich denke, es erkennt SDCard im lokalen Speicher und gibt daher true zurück. Was ich aber wirklich will, ist festzustellen, ob eine physische SD-Karte eingelegt ist oder nicht.

Kann ich dies tun, indem ich das Vorhandensein der Datei "/ storage/extSdCard" allein feststelle?

Vielen Dank.

11
Bowie

Stimmt es, dass der Dateipfad zur externen SD-Karte auf Android-Geräten immer "/ storage/extSdCard" ist? Wenn nicht, wie viele Variationen gibt es?

Leider ist der Pfad zum externen Speicher laut Hersteller nicht immer derselbe. Wenn Sie Environment.getExternalStorageDirectory() verwenden, wird der normale Pfad für die SD-Karte (mnt/sdcard/) angezeigt. Bei Samsung-Geräten zum Beispiel befindet sich der Pfad der SD-Karte entweder unter mnt/extSdCard/ oder unter mnt/external_sd/.

Eine Möglichkeit wäre, das Vorhandensein eines externen Verzeichnisses anhand des von jedem Hersteller verwendeten Pfads zu überprüfen. Mit so etwas wie:

mExternalDirectory = Environment.getExternalStorageDirectory()
            .getAbsolutePath();
    if (Android.os.Build.DEVICE.contains("samsung")
            || Android.os.Build.MANUFACTURER.contains("samsung")) {
        File f = new File(Environment.getExternalStorageDirectory()
                .getParent() + "/extSdCard" + "/myDirectory");
        if (f.exists() && f.isDirectory()) {
            mExternalDirectory = Environment.getExternalStorageDirectory()
                    .getParent() + "/extSdCard";
        } else {
            f = new File(Environment.getExternalStorageDirectory()
                    .getAbsolutePath() + "/external_sd" + "/myDirectory");  
            if (f.exists() && f.isDirectory()) {
                mExternalDirectory = Environment
                        .getExternalStorageDirectory().getAbsolutePath()
                        + "/external_sd";
            }
        }
    }

Was ich aber wirklich will, ist festzustellen, ob eine physische SD-Karte eingelegt ist oder nicht.

Ich habe den Code noch nicht ausprobiert, aber der Ansatz von Dmitri Lozenko in dieser Antwort ist viel interessanter. Seine Methode gibt den Pfad aller eingebauten SD-Karten auf dem System unabhängig vom Hersteller zurück.

5
Digoun

Ich hoffe es wird für dich nützlich sein :)

import Android.os.Environment;
import Java.io.File;
import Java.util.ArrayList;
import Java.util.HashMap;
import Java.util.List;
import Java.util.Map;
import Java.util.Scanner;


public class MemoryStorage {

    private MemoryStorage() {}

    public static final String SD_CARD = "sdCard";
    public static final String EXTERNAL_SD_CARD = "externalSdCard";

    /**
     * @return True if the external storage is available. False otherwise.
     */
    public static boolean isAvailable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            return true;
        }
        return false;
    }

    public static String getSdCardPath() {
        return Environment.getExternalStorageDirectory().getPath() + "/";
    }

    /**
     * @return True if the external storage is writable. False otherwise.
     */
    public static boolean isWritable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            return true;
        }
        return false;

    }

    /**
     * @return A map of all storage locations available
     */
    public static Map<String, File> getAllStorageLocations() {
        Map<String, File> map = new HashMap<String, File>(10);

        List<String> mMounts = new ArrayList<String>(10);
        List<String> mVold = new ArrayList<String>(10);
        mMounts.add("/mnt/sdcard");
        mVold.add("/mnt/sdcard");

        try {
            File mountFile = new File("/proc/mounts");
            if (mountFile.exists()) {
                Scanner scanner = new Scanner(mountFile);
                while (scanner.hasNext()) {
                    String line = scanner.nextLine();
                    if (line.startsWith("/dev/block/vold/")) {
                        String[] lineElements = line.split(" ");
                        String element = lineElements[1];

                        // don't add the default mount path
                        // it's already in the list.
                        if (!element.equals("/mnt/sdcard"))
                            mMounts.add(element);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            File voldFile = new File("/system/etc/vold.fstab");
            if (voldFile.exists()) {
                Scanner scanner = new Scanner(voldFile);
                while (scanner.hasNext()) {
                    String line = scanner.nextLine();
                    if (line.startsWith("dev_mount")) {
                        String[] lineElements = line.split(" ");
                        String element = lineElements[2];

                        if (element.contains(":"))
                            element = element.substring(0, element.indexOf(":"));
                        if (!element.equals("/mnt/sdcard"))
                            mVold.add(element);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        for (int i = 0; i < mMounts.size(); i++) {
            String mount = mMounts.get(i);
            if (!mVold.contains(mount))
                mMounts.remove(i--);
        }
        mVold.clear();

        List<String> mountHash = new ArrayList<String>(10);

        for (String mount : mMounts) {
            File root = new File(mount);
            if (root.exists() && root.isDirectory() && root.canWrite()) {
                File[] list = root.listFiles();
                String hash = "[";
                if (list != null) {
                    for (File f : list) {
                        hash += f.getName().hashCode() + ":" + f.length() + ", ";
                    }
                }
                hash += "]";
                if (!mountHash.contains(hash)) {
                    String key = SD_CARD + "_" + map.size();
                    if (map.size() == 0) {
                        key = SD_CARD;
                    } else if (map.size() == 1) {
                        key = EXTERNAL_SD_CARD;
                    }
                    mountHash.add(hash);
                    map.put(key, root);
                }
            }
        }

        mMounts.clear();

        if (map.isEmpty()) {
            map.put(SD_CARD, Environment.getExternalStorageDirectory());
        }
        return map;
    }
}
5
Alex Evtushik

So habe ich endlich den SD-Pfad mit:

public String getExternalStoragePath() {

        String internalPath = Environment.getExternalStorageDirectory().getAbsolutePath();
        String[] paths = internalPath.split("/");
        String parentPath = "/";
        for (String s : paths) {
            if (s.trim().length() > 0) {
                parentPath = parentPath.concat(s);
                break;
            }
        }
        File parent = new File(parentPath);
        if (parent.exists()) {
            File[] files = parent.listFiles();
            for (File file : files) {
                String filePath = file.getAbsolutePath();
                Log.d(TAG, filePath);
                if (filePath.equals(internalPath)) {
                    continue;
                } else if (filePath.toLowerCase().contains("sdcard")) {
                    return filePath;
                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
                    try {
                        if (Environment.isExternalStorageRemovable(file)) {
                            return filePath;
                        }
                    } catch (RuntimeException e) {
                        Log.e(TAG, "RuntimeException: " + e);
                    }
                }
            }

        }
        return null;
    }
2
Honey Agarwal

Ich habe gerade etwas herausgefunden. Zumindest für meinen Android-Emulator hatte ich den SD-Kartenpfad wie '/ storage/???? - ???? 'wo jeder? ist ein Großbuchstabe oder eine Ziffer.

Wenn das Verzeichnis/storage/über ein lesbares Verzeichnis verfügt, das nicht das interne Speicherverzeichnis ist, muss die SD-Karte sein.

Mein Code hat auf meinem Android-Emulator funktioniert!

String removableStoragePath;
    File fileList[] = new File("/storage/").listFiles();
    for (File file : fileList)
  {     if(!file.getAbsolutePath().equalsIgnoreCase(Environment.getExternalStorageDirectory().getAbsolutePath()) && file.isDirectory() && file.canRead())
        removableStoragePath = file.getAbsolutePath();  }
    //If there is an SD Card, removableStoragePath will have it's path. If there isn't it will be an empty string.

Wenn eine SD-Karte vorhanden ist, hat ovableStoragePath den Pfad. Ist dies nicht der Fall, wird es eine leere Zeichenfolge sein.

1
Paresh Kalinani

Ich habe nach 4 Tagen eine Lösung gefunden. Bitte beachten Sie die folgenden Punkte, während Sie den Pfad zur Dateiklasse in Android (Java) angeben:

  1. Pfad für internen Speicher String verwenden path="/storage/sdcard0/myfile.txt";
  2. pfad für externen Speicher verwenden path="/storage/sdcard1/myfile.txt";
  3. erwähnen Sie Berechtigungen in der Manifest-Datei.

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

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

  1. Überprüfen Sie zunächst die Dateilänge zur Bestätigung.
  2. Überprüfen Sie die Pfade im ES File Explorer in Bezug auf sdcard0 und sdcard1 auf

z.B.:

File file = new File(path);
long = file.length();//in Bytes
1
Mahadev Mane

installieren Sie diesen kostenlosen Dateibrowser auf einfachste Weise und navigieren Sie zu Ihrer SD-Karte. Sie werden den Pfad oben lesen. In meinem Fall war der Pfad: storage/extsd/extsd01 / https://play.google.com/store/apps/details?id=com.smartwho. SmartFileManager

1
PippoApps.com