2

使用 Eclipse 文件资源管理器导航我的 android 目录时,我看到mnt/sdcardmnt/sdcard2,见下图:

调用Environment.getExternalStorageDirectory()它时返回mnt/sdcard,所以我认为mnt/sdcadexternal storage,并且mnt/sdcard2是我的实际 SD 卡,是真的吗?以及如何使用代码访问下的文件mnt/sdcard2

在此处输入图像描述

附言

看来我可以直接访问外部sd卡:

    File extStorageDir = Environment.getExternalStorageDirectory();
    String parent = extStorageDir.getParent();
    File extSdCardDir = new File(parent+"/sdcard2");

    File file = new File(extSdCardDir, "DemoFile.jpg");

但我想知道额外的 sd 卡会在其他情况下更改名称。

4

1 回答 1

1

您是对的,getExternalStorage将返回您的内置外部存储。不幸的是,如果设备还具有内置存储和 SD 卡,则 Jelly Bean 应用程序将不再能够使用 SD 卡。您可以尝试通过 shell 命令或硬编码路径来解决它,但是没有 root 就没有可靠的方法来访问它了。

这是最近添加的 Android CTS,所有 OEM 必须遵守才能使用 Play 商店。

兼容性计划概述 | 安卓开发者

Android 4.3 兼容性定义的第 9.5 节(第 34 页)

包含多个外部存储路径的设备实现不得允许 Android 应用程序写入辅助外部存储。

存储选项 | 安卓开发者

使用内部存储分区作为外部存储的设备也可能提供 SD 卡插槽。在这种情况下,SD 卡不是外部存储的一部分,您的应用无法访问它(额外的存储仅用于系统扫描的用户提供的媒体)。

Android 4.2 API | 安卓开发者

在多用户环境中保存数据

每当您的应用程序保存用户首选项、创建数据库或将文件写入用户的内部或外部存储空间时,只有在以该用户身份运行时才能访问该数据。

为确保您的应用程序在多用户环境中正常运行,请不要使用硬编码路径引用您的内部应用程序目录或外部存储位置,而是始终使用适当的 API:

For access to internal storage, use getFilesDir(), getCacheDir(), or openFileOutput().
For access to external storage, use getExternalFilesDir() or getExternalStoragePublicDirectory(). 

无论您使用这些 API 中的哪一个来保存给定用户的数据,在以不同用户身份运行时都无法访问这些数据。从您的应用程序的角度来看,每个用户都在完全独立的设备上运行。

于 2013-09-30T06:05:16.837 回答