android开发内置存储设备安卓6.0 外置sd卡路径的路径怎么获取

Android(23)
1.首先要添加一下权限:
android:name="android.permission.WRITE_EXTERNAL_STORAGE"&&
2.获取内置sd卡的方法:
Environment.getExternalStorageDirectory().getPath()
3.获取手机内部所有外部存储的路径的方法:
import java.lang.reflect.InvocationTargetE
import java.lang.reflect.M
import android.app.A
import android.os.storage.StorageM
public class StorageList {
private Activity mA
private StorageManager mStorageM
private Method mMethodGetP
public StorageList(Activity activity) {
mActivity =
if (mActivity != null) {
mStorageManager = (StorageManager)mActivity.getSystemService(Activity.STORAGE_SERVICE);
mMethodGetPaths = mStorageManager.getClass().getMethod("getVolumePaths");
} catch (NoSuchMethodException e) {
e.printStackTrace();
public String[] getVolumePaths() {
String[] paths = null;
paths = (String[]) mMethodGetPaths.invoke(mStorageManager);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
4.一些有用的文件操作:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:10969次
排名:千里之外
转载:25篇
(1)(4)(4)(8)(16)Android 获取存储卡路径和空间使用情况
- android 学习 - ITeye博客
博客分类:
/** 获取存储卡路径 */
File sdcardDir=Environment.getExternalStorageDirectory();
/** StatFs 看文件系统空间使用情况 */
StatFs statFs=new StatFs(sdcardDir.getPath());
/** Block 的 size*/
Long blockSize=statFs.getBlockSize();
/** 总 Block 数量 */
Long totalBlocks=statFs.getBlockCount();
/** 已使用的 Block 数量 */
Long availableBlocks=statFs.getAvailableBlocks();
public class
Environment 英音:[in'vai?r?nm?nt]美音:[?n'va?r?nm?nt]
&!-- end header --&
android.os.Environment
Class Overview(类概述)
Provides access to environment variables. 提供访问环境变量。
returns MEDIA_BAD_REMOVAL if the media was removed before it was unmounted.
returns MEDIA_CHECKING if the media is present and being disk-checked
returns MEDIA_MOUNTED if the media is present and mounted at its mount point with read/write access.
returns MEDIA_MOUNTED_READ_ONLY if the media is present and mounted at its mount point with read only access.
returns MEDIA_NOFS if the media is present but is blank or is using an unsupported filesystem
returns MEDIA_REMOVED if the media is not present.
returns MEDIA_SHARED if the media is present not mounted, and shared via USB mass storage.
returns MEDIA_UNMOUNTABLE if the media is present but cannot be mounted.
returns MEDIA_UNMOUNTED if the media is present but not mounted.
Public Constructors(构造函数)
&!-- ========== METHOD SUMMARY =========== --&
Public Methods
Gets the Android data directory.获取Android的数据目录。
: Gets the Android Download/Cache content directory.获取的Android下载/缓存内容的目录。
:Gets the Android external storage directory.获取Android的外部存储目录。
( type) :Get a top-level public external storage directory for placing files of a particular type.获取为特定类型的文件放在顶层的公共外部存储目录。
() :Gets the current state of the primary "external" storage device.获取的主要“外部”存储设备的当前状态。
() :Gets the Android root directory.获取Android的根目录。
static boolean
() :Returns whether the device has an external storage device which is emulated.返回设备是否有外部存储设备的仿真。
static boolean
() :Returns whether the primary "external" storage device is removable.返回主“外部存储设备是否是可拆卸的。
public static
getExternalStorageDirectory ()
获取Android的外部存储目录。这个目录可能目前无法访问,如果它已被安装在其计算机上的用户,已被删除从设备,或发生其他一些问题。你可以确定其当前状态 。
注意:不要被这里的“外部”字混淆。这个目录可以更好地被看作媒体/共享存储。这是一个文件系统,可容纳的数据量相对较大,跨所有应用程序共享(不执行的权限)。传统上,这是一个SD卡,但它也可作为内置存储设备,从受保护的内部存储是不同的,可以在计算机上的文件系统安装在实施。
在与多个“外部”存储目录(如既安全应用程序存储和挂载共享存储)设备中,这个目录表示“小学化”的用户将与外部存储。
应用程序不应该直接使用这个顶级目录,以避免污染用户的根命名空间。任何专用应用程序的文件,这些文件应该被放置在返回目录,该系统将采取删除,如果应用程序被卸载。其他共享文件应该被放置在一个由返回目录。
下面是一个典型的代码,例如监察外部存储的状态:
BroadcastReceiver mExternalStorageR
boolean mExternalStorageAvailable =
boolean mExternalStorageWriteable =
void updateExternalStorageState() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
mExternalStorageAvailable = mExternalStorageWriteable =
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
mExternalStorageAvailable =
mExternalStorageWriteable =
mExternalStorageAvailable = mExternalStorageWriteable =
handleExternalStorageState(mExternalStorageAvailable,
mExternalStorageWriteable);
void startWatchingExternalStorage() {
mExternalStorageReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.i("test", "Storage: " + intent.getData());
updateExternalStorageState();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
filter.addAction(Intent.ACTION_MEDIA_REMOVED);
registerReceiver(mExternalStorageReceiver, filter);
updateExternalStorageState();
void stopWatchingExternalStorage() {
unregisterReceiver(mExternalStorageReceiver);
xiaoyaoniu
浏览: 141476 次
来自: 郑州
,第一个方法是全角符转半角符吧?
牛逼!用第一个方法就行了,简单!
好内容虽然过了这么久了,但是一定要赞一下获取 内外存储设备路径疑问 -
- ITeye博客
android 系统是开源的,于是各种产商各种瞎改android系统,工作了几个月,我发现单单就android的内外存储设备的路径我就不知道怎么获取了。上网查了几种方案,自己试验了下,感觉好迷茫啊。在这里记录下我试验的几种方案。
方案一:通过Enviroment类获取存储设备路径
android的官方文档上说,采用Enviroment.getExternalStorageDirectory()方法可以得到android设备的外置存储(即外插SDCARD),如果android设备有外插SDCARD的话就返回外插SDCARD的根目录路径,如果android设备没有外插SDCARD的话就返回android设备的内置SDCARD的路径。这套方案很快就被否决了,因为Enviroment类的这个方法里面的路径也是写死的,只有原生的android系统才使用这套方案,被更改过的anroid体统很多设备的路径都改了。
方案二:读取system/etc/vold.fstab文件的内容来获取存储设备路径
参考文档:
内置和外置SD卡的信息存在system/etc/vold.fstab 里面,我们可以从这里获得外置SD卡的路径。经本人实验,发现很多疑问。我的机子是三星I9300,我的机子没有外插SDCARD。通过eclipse获取vold.fstab文件,打开来看,有用的内容如下:
dev_mount sdcard /storage/extSdCard auto /devices/platform/s3c-sdhci.2/mmc_host/mmc1/
dev_mount sda /storage/UsbDriveA auto /devices/platform/s5p-ehci
dev_mount sdb /storage/UsbDriveB auto /devices/platform/s5p-ehci
dev_mount sdc /storage/UsbDriveC auto /devices/platform/s5p-ehci
dev_mount sdd /storage/UsbDriveD auto /devices/platform/s5p-ehci
dev_mount sde /storage/UsbDriveE auto /devices/platform/s5p-ehci
dev_mount sdf /storage/UsbDriveF auto /devices/platform/s5p-ehci
这里可没有我的内置SDCARD的路径啊,不懂。打开手机的文件系统发现我的内置的SDCARD路径是:/storage/emulated/0。于是我到eclipse的DDMS中去看下我的手机文件系统,发现storage路径下的文件结构为: 从这个文件结构可以看出,真正有内容的应该是emulated/legacy和sdcard0才对,再从后面的连接来看,最后这两个目录都应该是指向/mnt/shell/emulated/0。接着打开/mnt/shell/emulated/0来看看,果然是我的sdcard目录
这让我很疑惑,这样的话,读取vold.fstab文件来获取sdcard目录不就得不到/mnt/shell/emulated/0目录了么。方案二失败。
方案三:方案三的原理是linux命令,在命令窗口中输入 mount 或者 cat /proc/mounts 可得到系统挂载的存储。你也可以在DOS窗口中输入 adb shell -& mount ,或者 adb shell -& cat /proc/mounts 来查看( ”-&“ 符号只是一个分割符,不要输)。好,我来DOS窗口中输入adb shell -& mount 来看下会得到什么
这个我也看不懂,不过我猜最后一条应该是我的SDCARD的挂载了,因为有/mnt/shell/emulated 挂载路劲出现, 而/data/media是挂载的设备么?这是什么东西?好,我借部手机来看看,看其他的手机会mount出什么东西来。 那就借部note3来吧
我借来的这部手机有外插SDCARD。可以看到最后两条应该是挂载SDCARD信息了。不过它的挂载设备是/dev/fuse, 和 /dev/block/vold/179:17
。 好吧,我晕了,等等,会不会 最后两条信息才是挂载SDCARD信息呢?我的是手机因为没有外插SDCARD,所以最后一条才是挂载SDCARD信息,有外插SDCARD的,最后两条是挂载SDCARD信息。这是规律?好吧,不是规律,我又借了部手机,mount了下,发现这个猜想纯属扯淡。
利用mount命令来获取SDCARD路径的方法,
android常见的SD卡存储位置/storage/emulated/0//storage/extSdCard/mnt/external_sd//mnt/sdcard2//mnt/sdcard/external_sd//mnt/sdcard-ext//mnt/sdcard//storage/sdcard0//mnt/extSdCard//mnt/extsd//mnt/emmc//mnt/extern_sd//mnt/ext_sd//mnt/ext_card//mnt/_ExternalSD//sdcard2//sdcard//sdcard/sd//sdcard/external_sd//mnt/sd//mnt//storage//mnt/sdcard/sd//mnt/exsdcard//mnt/sdcard/extStorages/SdCard//ext_card//storage/extSdCard
3.0以上可以通过反射获取:
StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
String[] paths = (String[]) sm.getClass().getMethod("getVolumePaths", null).invoke(sm, null);
Android 4.1上
StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
String[] volumePaths = sm.getgetVolumePaths();
可以获得所有mount的SD卡,难道我要一条一条路径去遍历?就算遍历到了,我也不知道哪条是内置存储,哪条是外置存储。而且以后哪个深井冰产商又整出一条路径出来,不就没完没了了嘛。
我现在很郁闷,到底怎么弄才有一套最佳方案?跪求大神解救我。
* 获取外置SD卡路径
public static List&String& getSDCardPaths() {
List&String& sdcardPaths = new ArrayList&String&();
String cmd = "cat /proc/mounts";
Runtime run = Runtime.getRuntime();// 返回与当前 Java 应用程序相关的运行时对象
Process p = run.exec(cmd);// 启动另一个进程来执行命令
BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
String lineS
while ((lineStr = inBr.readLine()) != null) {
// 获得命令执行后在控制台的输出信息
LogUtil.i("CommonUtil:getSDCardPath", lineStr);
String[] temp = TextUtils.split(lineStr, " ");
// 得到的输出的第二个空格后面是路径
String result = temp[1];
File file = new File(result);
if (file.isDirectory() && file.canRead() && file.canWrite()) {
LogUtil.d("directory can read can write:",
file.getAbsolutePath());
// 可读可写的文件夹未必是sdcard,我的手机的sdcard下的Android/obb文件夹也可以得到
sdcardPaths.add(result);
// 检查命令是否执行失败。
if (p.waitFor() != 0 && p.exitValue() == 1) {
// p.exitValue()==0表示正常结束,1:非正常结束
LogUtil.e("CommonUtil:getSDCardPath", "命令执行失败!");
inBr.close();
in.close();
} catch (Exception e) {
LogUtil.e("CommonUtil:getSDCardPath", e.toString());
sdcardPaths.add(Environment.getExternalStorageDirectory()
.getAbsolutePath());
optimize(sdcardPaths);
for (Iterator iterator = sdcardPaths.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
Log.e("清除过后", string);
return sdcardP
private static void optimize(List&String& sdcaredPaths) {
if (sdcaredPaths.size() == 0) {
int index = 0;
while (true) {
if (index &= sdcaredPaths.size() - 1) {
String lastItem = sdcaredPaths.get(sdcaredPaths.size() - 1);
for (int i = sdcaredPaths.size() - 2; i &= 0; i--) {
if (sdcaredPaths.get(i).contains(lastItem)) {
sdcaredPaths.remove(i);
String containsItem = sdcaredPaths.get(index);
for (int i = index + 1; i & sdcaredPaths.size(); i++) {
if (sdcaredPaths.get(i).contains(containsItem)) {
sdcaredPaths.remove(i);
一定记得在manifest.xml中加权限
浏览 19262
浏览: 642469 次
所以这种情况是不使用launchMode为singleTask ...android 如何获取系统内置的存储空间路径
本回答由提问者推荐
(11条回答)}

我要回帖

更多关于 获取外置sd卡路径 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信