【问题标题】:How to access External Micro SD card of the phone?如何访问手机的外部 Micro SD 卡?
【发布时间】:2012-07-30 06:39:33
【问题描述】:

有谁知道我如何获得手机的 SD 卡?

我知道有人会告诉我它的getExternalStorageDirectory()Environment.getExternalStoragePublicDirectory()

但不幸的是,它并不总是在所有型号中都指向外部 SD 卡。例如,我尝试了一种三星型号,它工作正常,但另一种不行,LG 不行。而且根据文档,它并不总是外部 SD 卡。

来了,

*"这里不要被“外部”这个词弄糊涂了。

这个目录最好被认为是媒体/共享存储。它是一个文件系统,可以保存相对大量的数据,并且在所有应用程序之间共享(不强制执行权限)。

传统上这是一张 SD 卡,但它也可以作为设备中的内置存储实现,不同于受保护的内部存储,并且可以作为文件系统安装在计算机上。"*

在我的应用程序中,我希望用户只使用 SD 卡。

我该如何克服这个问题?

【问题讨论】:

  • 即使我没有找到答案,我是否也必须接受所有答案?如果是或这是一个规则,那么告诉我我会接受所有这些。

标签: android eclipse


【解决方案1】:

查看 CommonsWare 对同一主题的回答 https://stackoverflow.com/a/5695129/582571

他提到我们无法区分手机的内置外部存储和可移动外部存储。

但是通过 Aleadam 的回答 https://stackoverflow.com/a/6049446/582571 我们只能通过 isExternalStorageRemovable() 函数检查外部存储是否可移动。

希望你能明白。

【讨论】:

  • 感谢android Coader,isExternalStorageRemovable() 很好。但是如果我们也可以检查该文件夹的名称会更好。因为我猜它必须是 SD 卡的名称,例如 SDCard/_ExSDCard 或类似的名称。可能吗?如果是,那么问题就解决了。
  • 如果手机内部有“外置存储”,那么用户插入和sd卡,我们可以选择使用两者中的哪个“外置存储”吗?
【解决方案2】:

您可以在以下条件下检查 SDCard 是否可用

if (android.os.Environment.getExternalStorageState().equals(
            android.os.Environment.MEDIA_MOUNTED)) {

     //Check for the file
     File appFolder = new File(Environment.getExternalStorageDirectory() + File.separator
                + context.getString(R.string.app_name));

     boolean exist = appFolder.exists();
}

【讨论】:

  • 正如我在问题中已经提到的那样,getExternalStorage() 只会为您提供有关公共共享内存的信息,而不是有关任何可移动存储的任何信息。根据 Android Coader 的说法,它也是真的,这就是我在所有调查之后的猜测。
【解决方案3】:

我也遇到了同样的问题。我不知道如何访问外部 sd 卡位置。我正在开发一个应用程序,其中我必须访问外部 sd 卡才能读取和写入一些东西。我尝试了不同的方法,包括预定义的 android 库。这些是我使用的方法:-

这些是失误:-

File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File myFile = new File(path, "test.txt"); 

File root = Environment.getExternalStorageDirectory();
File dir = new File(root.getAbsolutePath()+"/Download");

File f = getExternalFilesDir(null); 
File file = new File(f,"test.txt");

这些都在访问内部存储“/storage/sdcard0”或“/storage/emulated/0”。原因是在 android 设备中,内部存储的部分充当外部存储。因此,如果您有大约 16 Gb 或更多的内部存储并且可以选择使用 sd 卡扩展设备,那么这是我猜想访问外部 sd 卡的唯一方法,因为即使是内置函数和库android studio 将访问内部存储作为外部存储。

最后我用了这个:-

String extFilePath = "/storage/sdcard1/Download";
File myFile = new File(extFilePath, "test.txt");

它奏效了。所以你看到预定义的 android 库/函数在哪里失败了,我可以用简单的字符串来完成任务。

除此之外,如果您想检查设备外部存储的路径,请尝试以下操作:-

String sdpath,sd1path,usbdiskpath,sd0path;

if(new File("/storage/extSdCard/").exists())
{sdpath="/storage/extSdCard/";
Log.i("Sd Cardext Path", sdpath);}

if(new File("/storage/sdcard1/").exists())
{sd1path="/storage/sdcard1/";
Log.i("Sd Card1 Path",sd1path);}

if(new File("/storage/usbcard1/").exists())
{usbdiskpath="/storage/usbcard1/";
Log.i("USB Path",usbdiskpath);}

if(new File("/storage/sdcard0/").exists())
{sd0path="/storage/sdcard0/";
Log.i("Sd Card0 Path",sd0path);}

检查这些可能有助于您了解在访问外部 sd 卡时选择什么路径。我希望这对其他人有所帮助。

【讨论】:

  • 这可能经常起作用,但重要的是要注意字符串可能因设备而异。例如。在我的 Xperia Z5 上是/storage/0000-0000/
【解决方案4】:

可移动存储路径因设备而异。
可移动路径的示例是:
1. mnt/ext
2. mnt/externalsd
3. mnt/external_sd


我的设备使用 mnt/external_sd。

您可以从vold.fstab 文件中检查文件的路径。
该文件位于系统文件夹下。
文件路径为:

“/etc/vold.fstab”

【讨论】:

    【解决方案5】:

    我的最新设备也遇到了同样的问题。然后我发现可以在 /mnt/ext_sdcard/ 访问可移动 SD 卡。它对我有用。我能够在此位置列出存储在可移动外部 sd 卡中的所有文件。

    以下是代码: new File("/mnt/ext_sdcard/").listFiles();

    【讨论】:

      【解决方案6】:

      你可以像下面这样获取路径.....

      File sdCardRoot = Environment.getExternalStorageDirectory();
              PATH = sdCardRoot.toString();
      

      如果路径不存在,则必须通过 mkdir() 来创建路径.....

      private File getTempFile(Context context) {
              final File path = new File(Environment.getExternalStorageDirectory(),
                      context.getPackageName());
              if (!path.exists()) {
                  path.mkdir();
              }
              return new File(path, "new.png");
          }
      

      上面的函数会返回文件...

      【讨论】:

      • 这就是我在问题中所说的,getExternalStorageDirectory() 不起作用。如果有的话,它会给你你的内部共享内存,大多数手机都有。
      猜你喜欢
      • 2018-04-17
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      相关资源
      最近更新 更多