以前的Android(4.1之前的版本)中,SDcard跟路径通过“/sdcard”或者“/mnt/sdcard”来表示存储卡,而在Jelly Bean系统中修改为了“/storage/sdcard0”,以后可能还会有多个SDcard的情况。

目前为了保持和之前代码的兼容,sdcard路径做了link映射。

为了使您的代码更加健壮并且能够兼容以后的Android版本和新的设备,请通过Environment.getExternalStorageDirectory().getPath()来获取sdcard路径,

如果您需要往sdcard中保存特定类型的内容,可以考虑使用Environment.getExternalStoragePublicDirectory(String type)函数,该函数可以返回特定类型的目录,目前支持如下类型:

DIRECTORY_ALARMS //警报的铃声
DIRECTORY_DCIM //相机拍摄的图片和视频保存的位置
DIRECTORY_DOWNLOADS //下载文件保存的位置
DIRECTORY_MOVIES //电影保存的位置, 比如 通过google play下载的电影
DIRECTORY_MUSIC //音乐保存的位置
DIRECTORY_NOTIFICATIONS //通知音保存的位置
DIRECTORY_PICTURES //下载的图片保存的位置
DIRECTORY_PODCASTS //用于保存podcast(博客)的音频文件
DIRECTORY_RINGTONES //保存铃声的位置

如果您的应用需要下载以上类型的文件,则可以放到上面对应的目录中去来帮助用户查找,比如最常用的就是下载文件了。如果您开发了一个浏览器,在下载文件的时候把文件下载到Download目录则方便用户以后查找该文件,当然如果你希望用户需要通过启动您的程序来查看他们下载的文件,您也可以不这么做 ^_^。

在使用这些目录保存文件的时候,需要注意一点:其他程序也有可能在 使用这些目录,在保存文件前,注意判断下文件是否已经存在,不要覆盖了用户之前的数据。


Android4.1之后Android增加了多存储卡的支持,一般手机会存在内置存储卡和外置存储卡,也可能有多个外置存储卡。如何获取存储卡路径呢?

特别是各种android设备的存储器路径,是不一样的,比如T卡路径,可能是/mnt/sdcard、/mnt/extsd、/mnt/external_sd 或者/mnt/sdcard2。有时内置存储器的路径也可能是/mnt/sdcard,而host usb存储器的路径也是各种各样的。

下面方法是通过反射,调用StorageManager的隐藏接口getVolumePaths(),实现获取存储器列表。
[java]
package ckl.storage.list;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.os.storage.StorageManager;

public class StorageList {
private Activity mActivity;
private StorageManager mStorageManager;
private Method mMethodGetPaths;

public StorageList(Activity activity) {
mActivity = activity;
if (mActivity != null) {
mStorageManager = (StorageManager)mActivity
.getSystemService(Activity.STORAGE_SERVICE);
try {
mMethodGetPaths = mStorageManager.getClass()
.getMethod("getVolumePaths");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}

public String[] getVolumePaths() {
String[] paths = null;
try {
paths = (String[]) mMethodGetPaths.invoke(mStorageManager);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return paths;
}
}


调用:

if (list.getVolumePaths()[0].equals(Environment.MEDIA_MOUNTED)) {
textView.setText("有外部存储卡"+list.getVolumePaths()[0]);
} else {
textView.setText("有外部存储卡"+list.getVolumePaths()[1]);
}

在android2.3中,判断内置SD卡是否挂载:

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
//为true的话,内置sd卡存在
}

判断外置SD卡是否挂载:

if(Environment.getStorageState(Environment.STORAGE_PATH_SD2).equals(Environment.MEDIA_MOUNTED))
{
//为true的话,外置sd卡存在
}

顺带描述怎么取得sdcard的空间大小,
File sdcardDir = Environment.getExternalStorageDirectory();
StatFs sf = new StatFs(sdcardDir.getPath()); //sdcardDir.getPath())值为/mnt/sdcard,想取外置sd卡大小的话,直接代入/mnt/sdcard2
long blockSize = sf.getBlockSize(); //总大小
long blockCount = sf.getBlockCount();
long availCount = sf.getAvailableBlocks(); //有效大小

更多相关文章

  1. Android新手笔记—Android(安卓)Studio的安装
  2. Android(安卓)adb不是内部或外部命令 问题解决
  3. Android(安卓)Zip文件解压缩代码
  4. Android中Uri的使用
  5. android系统学习笔记三
  6. Android中Tomcat的简单配置和使用
  7. 在Ubuntu中和Android中添加开机自启动的守护进程
  8. Android(安卓)文件路径详解
  9. Android(安卓)URI

随机推荐

  1. Android之Activity透明背景
  2. android(Import Android(安卓)demo to Ecl
  3. 搭建 Android(安卓)2.2 开发环境
  4. Android异步处理四:AsyncTask的实现原理
  5. Android(安卓)- OpenCv - 解决预览图像自
  6. [Android引擎]Android游戏框架AndE…
  7. EditText属性及使用
  8. (学习笔记) Android(安卓)  Activity相关
  9. Android(安卓)imageView ScaleType.FIT_C
  10. 安卓布局属性代码中文注解