以前的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;

}

}

在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. Pycharm安装PyQt5的详细教程
  2. Android--SoLoader,android动态加载so库
  3. Android(安卓)命令行编译、打包生成apk文件
  4. android解决坚屏拍照和保存图片旋转90度的问题,并兼容4.0
  5. android手机客户端上传文件,java servlet服务器端接收并保存到服
  6. Android(安卓)获取存储卡路径和空间使用情况
  7. android Uri获取真实路径转换成File的方法
  8. android从服务器下载文件(php+apache+win7+MySql)
  9. activity状态的保存和保持(onRetainNonConfigurationInstance和g

随机推荐

  1. android View setText NotFoundException
  2. 方法一、使用Handler和Thread(线程)实现定
  3. Android(安卓)popupWindow 用法
  4. android listview滑动设置浮标半透明效果
  5. Android(安卓)ListView的OnItemClickList
  6. android工程中,各种类型的资源文件
  7. Android(安卓)scrollview里面放listview
  8. 【Android(安卓)开发教程】AnalogClock和
  9. Android数据过滤器:Filter
  10. Android使用WebView加载网页选择文件上传