Android 反射获取内外置存储卡方法

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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


转载于:https://my.oschina.net/u/1244156/blog/371897

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker安装mysql redis_Docker安装Mysql和Redis以及构建部署应用镜像

为了方便本地测试项目,为了方便开启新的环境,为了方便部署,打算本地利用Docker安装Mysql和Redis。搭建Springboot项目,编写Dockerfile,打包构建镜像。简单使用docker-compose启动服务。简述docker-compose和K8S。环境系…

plsql if

set serveroutput onaccept num prompt 请输入一个数字; declare pnum number : #beginif pnum0 then dbms_output.put_line(您输入的数据是0);elsif pnum1 then dbms_output.put_line(您输入的数据是1);elsif pnum2 then dbms_output.put_line(您输入的数据是2);e…

Windows 下查看端口占用情况 netstat / tasklist / findstr

为什么80%的码农都做不了架构师?>>> Windows服务器不熟悉很多,尤其是防火墙这块。不过其实和Linux一样,省事的话就是关了就好了。不过对于端口占用还是时常有的,比如QQ音乐,迅雷这些,如果你的电…

unicode 字符串转成 TDesC-转贴

unicode 字符串转成 TDesC所有描述符,其实都不是真实的类,而是一个typedef。在非内核模式的时候,所有的描述符,如TDesC,其真实的实现是TDesC16,在内核模式的时候,则是TDesC8。还是看名取义&…

第二阶段团队冲刺(七)

1、我昨天的成就:从老师那里要来了完整的无课表信息,不需要再从网站爬取,无课表导入数据库 2、遇到什么困难:无课表导入数据库格式兼容问题 3、今天的任务 :购买阿里云服务器并配置 转载于:https://www.cnblogs.com/Ad…

java任务poer_java-Powermock-模拟超级方法调用

这是我的代码-import org.junit.Test;import org.junit.runner.RunWith;import org.powermock.modules.junit4.PowerMockRunner;import org.powermock.core.classloader.annotations.*;import static org.powermock.api.support.SuppressCode.*;class BaseService {public int …

2015 年度计划

2019独角兽企业重金招聘Python工程师标准>>> scala -> akka -> sparketcd 使用开源产品 negroni https://github.com/codegangsta/negroni转载于:https://my.oschina.net/kuerant/blog/372981

Mybatis 动态传sql可以查询表名,任意表名,不固定字段的个数返回未定义的类型以及增删改...

mysql查询表名: SELECT table_name FROM information_schema.tables WHERE table_schemasell AND table_typebase table;查询表中的字段: SELECT column_name FROM information_schema.columns WHERE table_schemasell AND table_nameseller_infoSpringB…

As3.0与java数据类型的比较总结

As3.0与java数据类型的比较总结 1. 在As3.0中所有的数据类型都是对象,都有自己的方法和属性; Java中的基本数据类型,其采取和C和C相同的方法。也就是不用new来创建变量,而是创建一个并非是引用的“自动”变量。这个变量直接存储…

php透明颜色的代码,PHP imagecolorallocatealpha - 为一幅图像分配颜色和透明度

PHP imagecolorallocatealpha - 为一幅图像分配颜色和透明度imagecolorallocatealpha — 为一幅图像分配颜色和透明度。语法int imagecolorallocatealpha ( resource $image , int $red , int $green , int $blue , int $alpha )imagecolorallocatealpha() 的行为和 imagecolor…

C语言goto关键字—尽量少用

一般来说,编码的水平与goto 语句使用的次数成反比。有的人主张慎用但不禁用goto语句,但我主张禁用。关于goto 语句的更多讨论可以参看Steve McConnell 的名著《CodeComplete. Second Edition》。 禁用goto 语句。自从提倡结构化设计以来,goto…

C#中使用Oracle 存储过程笔记

C#中使用Oracle 存储过程笔记1. 调用包含out/ in out类型参数的存储过程 存储过程: CREATE OR REPLACE PROCEDURE "SITE_EDITSITEDATAEXIST" (id_ number,name_ varchar2,httpRoot_ varchar2,flag out integer )//out 只具备输出功能 in out 为输入/输出型astempNum …

php网页生命周期函数,PHP的生命周期

PHP的生命周期php本身的生命周期是在命令行执行php test.php程序的生命周期(也就是cli)整个过程如下:执行php test.php调用每个扩展的模块初始化程序请求test.php程序调用每个扩展的请求初始化程序执行test.php程序调用每个扩展的请求关闭程序释放内存等清除工作调用…

为什么需要做归一化或者标准化

为什么需要做归一化或者标准化 一句话解释就是为了让我们求解loss最低值的过程中更加的平稳和缓,容易收敛。 具体解释可以看这里: 特征工程中的「归一化」有什么作用? - 忆臻的回答 - 知乎https://www.zhihu.com/question/20455227/answer/197897298 用我…

Windows on Device 项目实践 4 - 智能风扇制作

在前面的文章中,我们已经学习并且利用Intel Galileo开发板和Windows on Device制作了火焰报警器、感光灯和PWM调光灯。在这个项目中,我们来利用温度传感器和直流电机,完成一个简单的智能风扇的制作。 1. 温度传感器 LM35 是很常用且易用的温度…

Linux系统信息查看命令大全

系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所…

php接口异常,api接口异常怎么办

异常:在程序开发过程中出现的不正常情况,就是异常。比如除数是0,参数为null,调用参数的成员变量或者方法,数组下标越界。异常分为两大类型:(1)Exception:程序员可以解决的:空指针&am…

并发编程5-同步器

Synchronizer 控制多个线程的流程,比如线程执行到某一个点的时候是等待还是通过。 JDK中自带了信号量,关卡,闭锁闭锁CoutDownLatch 达到最终状态前是关闭的,所有线程在此阻塞, 达到最终状态后开放,并且不可…

RE validation in Java EE

pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。 Pattern类中有两个最常用的方法&#xff1…

Apache Rewrite 规则详解

1、Rewrite规则简介: Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的(.htaccess) 两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apach…