如何获取android中的内部和外部sdcard路径

时间:2012-11-13 12:46:53

标签: android file android-sdcard android-file

大多数新的Android设备都有内部SD卡和外部SD卡。我想创建一个文件浏览器应用程序但我无法找到如何在我的应用程序中使用该路径,因为

File file = Environment.getExternalStorageDirectory();

只返回大多数设备/mnt/sdcard 但是另一个外部SD卡的路径如/storage1 or /storage2  。任何帮助表示赞赏。

8 个答案:

答案 0 :(得分:9)

  

如何在android

中获取内部和外部sdcard路径

存储在内部存储中的方法:

File getDir (String name, int mode)

File getFilesDir () 

上述方法存在于Context

存储在手机内存中的方法:

File getExternalStorageDirectory ()

File getExternalFilesDir (String type)

File getExternalStoragePublicDirectory (String type)

一开始,每个人都使用Environment.getExternalStorageDirectory(),它指向手机内存的 root 。结果,根目录中填充了随机内容。

后来,添加了这两种方法:

Context课程中,他们添加了getExternalFilesDir(),指向手机内存中特定于应用的目录。卸载应用程序时,将删除此目录及其内容。

Environment.getExternalStoragePublicDirectory()用于存储众所周知的文件类型(如照片和电影)的集中位置。卸载应用程序时,将删除此目录及其内容 NOT

存储在可移动存储中的方法,即micro SD卡

在API级别19之前,没有正式的方法存储在SD卡中。但许多人可以使用非官方API来做到这一点。

正式地,在{strong> API级别19 (Android版本4.4 - Kitkat)的Context课程中引入了一种方法。

File[] getExternalFilesDirs (String type)
  

它返回所有应用程序特定目录的绝对路径   应用程序可以放置的共享/外部存储设备   它拥有的持久文件。这些文件是应用程序的内部文件,   并且通常不会被用户视为媒体。

这意味着,它将返回Micro SD卡和内部存储器的路径。通常,第二个返回路径将是micro SD卡的存储路径。

根据Google /官方Android文档,内部和外部存储术语与我们的想法相比非常不同

答案 1 :(得分:2)

是。不同厂商使用不同的SD卡名称,如三星Tab 3中的extsd,以及其他三星设备使用sdcard这样不同的厂商使用不同的名称。

我和你有同样的要求。所以我已经从我的项目中为您创建了一个示例示例,转到此链接Android Directory chooser示例,该示例使用了androi-dirchooser库。此示例检测SD卡并列出所有子文件夹,它还检测设备是否有多于一张SD卡。

部分代码如下所示。完整示例转到链接Android Directory Chooser

/**
* Returns the path to internal storage ex:- /storage/emulated/0
 *
* @return
 */
private String getInternalDirectoryPath() {
return Environment.getExternalStorageDirectory().getAbsolutePath();
 }

/**
 * Returns the SDcard storage path for samsung ex:- /storage/extSdCard
 *
 * @return
 */
    private String getSDcardDirectoryPath() {
    return System.getenv("SECONDARY_STORAGE");
}


 mSdcardLayout.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        String sdCardPath;
        /***
         * Null check because user may click on already selected buton before selecting the folder
         * And mSelectedDir may contain some wrong path like when user confirm dialog and swith back again
         */

        if (mSelectedDir != null && !mSelectedDir.getAbsolutePath().contains(System.getenv("SECONDARY_STORAGE"))) {
            mCurrentInternalPath = mSelectedDir.getAbsolutePath();
        } else {
            mCurrentInternalPath = getInternalDirectoryPath();
        }
        if (mCurrentSDcardPath != null) {
            sdCardPath = mCurrentSDcardPath;
        } else {
            sdCardPath = getSDcardDirectoryPath();
        }
        //When there is only one SDcard
        if (sdCardPath != null) {
            if (!sdCardPath.contains(":")) {
                updateButtonColor(STORAGE_EXTERNAL);
                File dir = new File(sdCardPath);
                changeDirectory(dir);
            } else if (sdCardPath.contains(":")) {
                //Multiple Sdcards show root folder and remove the Internal storage from that.
                updateButtonColor(STORAGE_EXTERNAL);
                File dir = new File("/storage");
                changeDirectory(dir);
            }
        } else {
            //In some unknown scenario at least we can list the root folder
            updateButtonColor(STORAGE_EXTERNAL);
            File dir = new File("/storage");
            changeDirectory(dir);
        }


    }
});

答案 2 :(得分:1)

由于没有直接的方法可以获得解决方案的路径          扫描/system/etc/vold.fstab文件并查找如下所示的行:          dev_mount sdcard / mnt / sdcard 1          /devices/platform/s3c-sdhci.0/mmc_host/mmc0

当找到一个时,将其拆分为元素,然后拉出          该挂载点的路径并将其添加到arraylist

强调文字某些设备完全缺少vold文件,所以我们在这里添加一个路径          确保列表始终包含第一张SD卡的路径,          无论是真实的还是模仿的。

    sVold.add("/mnt/sdcard");

    try {
        Scanner scanner = new Scanner(new File("/system/etc/vold.fstab"));
        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.contains("usb"))
                    continue;

                // don't add the default vold path
                // it's already in the list.
                if (!sVold.contains(element))
                    sVold.add(element);
            }
        }
    } catch (Exception e) {
        // swallow - don't care
        e.printStackTrace();
    }
}

现在我们已经清理了一个挂载路径列表,测试每个路径 确定它是一个有效且可用的路径。如果不是,请将其删除 清单。

private static void testAndCleanList() 
{
    for (int i = 0; i < sVold.size(); i++) {
        String voldPath = sVold.get(i);
        File path = new File(voldPath);
        if (!path.exists() || !path.isDirectory() || !path.canWrite())
            sVold.remove(i--);
    }
}

答案 3 :(得分:1)

我不确定这是多么普遍的答案,但我在带有Android 4.4的摩托罗拉XT830C和Nexus 7 android 6.0.1上进行了测试。以及三星SM-T530NU Android 5.0.2。 我使用了System.getenv("SECONDARY_STORAGE")Environment.getExternalStorageDirectory().getAbsolutePath() 没有第二张SD卡的Nexus System.getenv返回null,Envirnoment.getExterna...给出/ storage / emulated / 0。 具有外部SD卡的motorola设备为System.getenv("SECONDARY_STORAGE")提供/ storage / sdcard1,Envirnoment.getExterna...提供/ storage / emulated / 0。 samsumg返回外部SD的/ storage / extSdCard 在我的情况下,我在外部位置创建一个子目录,并使用

 appDirectory = (System.getenv("SECONDARY_STORAGE") == null)
       ? Environment.getExternalStorageDirectory().getAbsolutePath()
       : System.getenv("SECONDARY_STORAGE");

找到SD卡。在此目录中创建一个子目录。
当然,我必须在清单文件中设置权限才能访问外部存储器。
我还有一个Nook 8“彩色平板电脑。当我有机会对它们进行测试时,如果我对这种方法有任何问题,我会发布。

答案 4 :(得分:0)

  

但是另外一个外部SD卡的路径,如/ storage1或/ storage2

Android SDK中没有任何内容 - 至少通过Android 4.1 - 可以让您访问这些路径。无论如何,它们可能无法通过您的应用程序读取或写入。这些存储位置的行为及其用途取决于设备制造商。

答案 5 :(得分:0)

试试这段代码会有所帮助

Map<String, File> externalLocations = ExternalStorage.getAllStorageLocations();
File sdCard = externalLocations.get(ExternalStorage.SD_CARD);
File externalSdCard = externalLocations.get(ExternalStorage.EXTERNAL_SD_CARD);

答案 6 :(得分:0)

File main=new File(String.valueOf(Environment.getExternalStorageDirectory().getAbsolutePath()));
File[]t=main.getParentFile().listFiles();

for(File dir:t)
{
    Log.e("Main",dir.getAbsolutePath());
}

输出:

E/Main: /storage/sdcard1
E/Main: /storage/sdcard0

我有一张SD卡和内置内存。

答案 7 :(得分:-1)

获取内部/外部SD卡路径没有公共API。

但是在android.os.storage包中有一个名为StorageManager的平台api。见http://goo.gl/QJj1eu

有一些功能,如列表存储,挂载/卸载存储,获取挂载状态,获取存储路径等。

但它是隐藏的api,它应该在下一个Android版本中弃用或破坏。

有些方法需要特别许可,而且大部分方法都没有记录。