Android获取内外置存储卡的方法

作者:雨点点 时间:2023-12-03 00:41:09 

以前的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(),实现获取存储器列表。


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(); //有效大小

标签:Android,存储卡
0
投稿

猜你喜欢

  • java Springboot实现多文件上传功能

    2023-11-09 04:31:32
  • Java基于动态规划法实现求最长公共子序列及最长公共子字符串示例

    2021-10-11 22:20:17
  • springboot整合EHCache的实践方案

    2023-08-23 23:48:31
  • Android应用内调用第三方应用的方法

    2023-02-03 11:11:32
  • Java实现有限状态机的推荐方案分享

    2022-01-07 15:54:27
  • C#实现多线程下载文件的方法

    2022-04-24 10:59:43
  • Springboot使用filter对response内容进行加密方式

    2023-11-17 15:29:25
  • C#记一次http协议multipart/form-data的boundary问题

    2021-07-01 17:45:49
  • Java中RedisUtils工具类的使用

    2022-05-04 21:32:32
  • Java枚举类用法实例

    2023-09-25 01:47:34
  • 使用vscode搭建javaweb项目的详细步骤

    2022-08-05 01:12:43
  • Java定时器Timer简述

    2023-07-20 19:17:16
  • 使用C#实现读取系统配置文件的代码实例讲解

    2023-02-18 10:36:56
  • 分享Java常用开发编辑器工具

    2023-11-06 07:35:37
  • c#实现服务器性能监控并发送邮件保存日志

    2023-09-10 11:56:14
  • Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(二)

    2022-11-14 18:37:22
  • Java高并发BlockingQueue重要的实现类详解

    2021-06-20 12:08:24
  • Android实现简单音乐播放器(MediaPlayer)

    2023-04-24 19:28:57
  • C#字符串String及字符Char的相关方法

    2023-10-26 03:05:37
  • 详解LINQ入门(上篇)

    2023-10-15 05:57:30
  • asp之家 软件编程 m.aspxhome.com