Android中获取内外存储卡位置的方法
2015-09-13 09:04
381 查看
获取内部存储卡的位置
sdcard中的一些特定类型的内容保存位置
获取外部存储卡的位置
在android23中判断内置SD卡是否挂载
怎么取得sdcard的空间大小
另一种写法可实现打印出路径名
目前为了保持和之前代码的兼容,sdcard路径做了link映射。
为了使您的代码更加健壮并且能够兼容以后的Android版本和新的设备,请通过Environment.getExternalStorageDirectory().getPath()来获取sdcard路径,
如果您需要往sdcard中保存特定类型的内容,可以考虑使用Environment.getExternalStoragePublicDirectory(String type)函数,该函数可以返回特定类型的目录,目前支持如下类型:
如果您的应用需要下载以上类型的文件,则可以放到上面对应的目录中去来帮助用户查找,比如最常用的就是下载文件了。如果您开发了一个浏览器,在下载文件的时候把文件下载到Download目录则方便用户以后查找该文件,当然如果你希望用户需要通过启动您的程序来查看他们下载的文件,您也可以不这么做 ^_^。
在使用这些目录保存文件的时候,需要注意一点:其他程序也有可能在使用这些目录,在保存文件前,注意判断下文件是否已经存在,不要覆盖了用户之前的数据。
特别是各种android设备的存储器路径,是不一样的,比如T卡路径,可能是/mnt/sdcard、/mnt/extsd、/mnt/external_sd 或者/mnt/sdcard2。有时内置存储器的路径也可能是/mnt/sdcard,而host usb存储器的路径也是各种各样的。
下面方法是通过反射,调用StorageManager的隐藏接口getVolumePaths(),实现获取存储器列表。
sdcard中的一些特定类型的内容保存位置
获取外部存储卡的位置
在android23中判断内置SD卡是否挂载
怎么取得sdcard的空间大小
另一种写法可实现打印出路径名
获取内部存储卡的位置
以前的Android(4.1之前的版本)中,SDcard跟路径通过“/sdcard”或者“/mnt/sdcard”来表示存储卡,而在Jelly Bean系统中修改为了“/storage/sdcard0”,以后可能还会有多个SDcard的情况。目前为了保持和之前代码的兼容,sdcard路径做了link映射。
为了使您的代码更加健壮并且能够兼容以后的Android版本和新的设备,请通过Environment.getExternalStorageDirectory().getPath()来获取sdcard路径,
如果您需要往sdcard中保存特定类型的内容,可以考虑使用Environment.getExternalStoragePublicDirectory(String type)函数,该函数可以返回特定类型的目录,目前支持如下类型:
sdcard中的一些特定类型的内容保存位置
[code]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(),实现获取存储器列表。
#
[code]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卡是否挂载:
[code]if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //为true的话,内置sd卡存在 } 判断外置SD卡是否挂载: if(Environment.getStorageState(Environment.STORAGE_PATH_SD2).equals(Environment.MEDIA_MOUNTED)) { //为true的话,外置sd卡存在 }
怎么取得sdcard的空间大小,
[code]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(); //有效大小
另一种写法、可实现打印出路径名
[code] public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_main_layout); /**设备管理器*/ StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE); try { Class<?>[] paramClasses = {}; /**反射实现*/ Method getVolumePathsMethod = StorageManager.class.getMethod("getVolumePaths", paramClasses); getVolumePathsMethod.setAccessible(true); Object[] params = {}; Object invoke = getVolumePathsMethod.invoke(storageManager, params); for (int i = 0; i < ((String[]) invoke).length; i++) { /** Android.os下的StatFs类主要用来获取文件系统的状态,能够获取sd卡的大小和剩余空间,获取系统内部空间也就是/system的大小和剩余空间等等。*/ StatFs stat = getStatFs(((String[]) invoke)[i]); Log.i("ldm", ((String[]) invoke)[i] + ":" + calculateSizeInMB(stat)); } } catch (Exception e1) { e1.printStackTrace(); } } private StatFs getStatFs(String path) { try { return new StatFs(path); } catch (Exception e) { e.printStackTrace(); } return null; } /**计算存储卡的可用容量(单位:M)*/ private float calculateSizeInMB(StatFs stat) { if (stat != null) return stat.getAvailableBlocks() * (stat.getBlockSize() / (1024f * 1024f)); return 0.0f; } }
相关文章推荐
- android 编译环境 libgl1-mesa-glx:i386相关安装后ubuntu启动失败
- Android开发框架xUtils简介(附有不使用findViewById的方法)
- Android中146种颜色对应的xml色值
- Gradle 载入中 Android 下一个.so档
- Ubuntu 下载 & 编译 Android5.1 源码
- Android 关于inflate
- 基于 Android蓝牙4.0开发详细讲解,与硬件通信 史上最牛逼,最详细
- Android应用进程间通信之Messenger信使使用及源码浅析
- andorid系统使用硬件资源_传感器1
- android-dialog
- [Android] AudioTrack::start
- Android应用开发之(通过ClipboardManager, ClipData进行复制粘贴)
- Android自己动手做查找控件、绑定监听的注解框架
- android-Notification
- 野人学Android基础篇之数据存储第一课--SQLite的使用及注意点
- 关于MPAndroidChart柱状图左右滑动
- 如何实现android蓝牙开发 自动配对连接,并不弹出提示框
- Android使用真机无法调试,抱错INSTALL_FAILED_INSUFFICIENT_STOR
- Android之多线程----异步消息处理机制之Handler详解
- Android数据持久化