直接上重点:

1:获取内置SD卡的路径, 但是判断是否有效(是否挂载), 需要用到下面检测挂载点的方法

/**

* 获取内置SD卡路径

*

* @return

*/

public String getInnerSDCardPath() {

return Environment.getExternalStorageDirectory().getPath();

}

2:枚举系统所有可用的挂载点,返回的都是绝对路径

/** 枚举所有挂载点 */

public static String[] getVolumePaths(Context context) {

String[] paths = null;

StorageManager mStorageManager;

Method mMethodGetPaths = null;

try {

mStorageManager = (StorageManager) context

.getSystemService(Activity.STORAGE_SERVICE);

mMethodGetPaths = mStorageManager.getClass().getMethod(

"getVolumePaths");

paths = (String[]) mMethodGetPaths.invoke(mStorageManager);

} catch (Exception e) {

e.printStackTrace();

}

return paths;

}

我的运行结果如下:

这里写图片描述

(图中中文是检测挂载的方法log输出)

3:检测挂载点是否可用

/**

* 检查是否挂载

*/

public static boolean checkMounted(Context context, String mountPoint) {

if (mountPoint == null) {

return false;

}

StorageManager storageManager = (StorageManager) context

.getSystemService(Context.STORAGE_SERVICE);

try {

Method getVolumeState = storageManager.getClass().getMethod(

"getVolumeState", String.class);

String state = (String) getVolumeState.invoke(storageManager,

mountPoint);

return Environment.MEDIA_MOUNTED.equals(state);

} catch (Exception e) {

e.printStackTrace();

}

return false;

}

(截图如上,如果已挂载,返回true)

SD卡广播:

//在AndroidManifest.xml文件中,声明广播

public class SDBroadCastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (action.equals(Intent.ACTION_MEDIA_EJECT)) {

Log.e(context.getClass().getSimpleName(), "SD卡已拔出");

} else if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {

Log.e(context.getClass().getSimpleName(), "SD卡挂载");

}

}

}

补充说明, 这里测试环境是Android 4.2.2, API 17

/mnt/sdcard :这是内置SD卡的路径(也是挂载点);(不同Android版本,可能不一样)

/mnt/extsd :这是外置SD卡的路径(也是挂载点);

所以:

如果要检测内置/外置SD卡是否存在(可用),方法如下:

if (checkMounted(MainActivity.this, "/mnt/sdcard")) {

Log.e(this.getLocalClassName(), "内置SD卡可用");

}

if (checkMounted(MainActivity.this, "/mnt/extsd")) {

Log.e(this.getLocalClassName(), "外置SD卡可用");

}

简单介绍 Java反射的用法:

1:获取需要反射的对象(需要修改属性,或者需要调用非公隐藏方法的对象):

StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);

2:得到对象需要调用的方法或者字段的名称

//得到 方法名称,这个方法必须是public声明的才能获取,如果要获取非公方法名,需要使用getDeclaredMethods方法

Method getVolumeState = storageManager.getClass().getMethod("getVolumeState", String.class);//第一个参数:方法的名称, 第二个参数:方法的参数

//得到 字段名,这里用了getDeclaredField方法,所以可以得到非公声明的字段

Field tag = storageManager.getClass().getDeclaredField("TAG");

tag.setAccessible(true);//因为可能字段是非公有,所以需要设置访问权限为公有

tag.set(storageManager, "New Tag");//修改字段的值

3:调用方法(字段赋值,前面已经说了)

String state = (String) getVolumeState.invoke(storageManager,mountPoint);

//storageManager :是需要修改的对象

//mountPoint :方法需要的参数

至此: 文章就结束了,如有疑问: QQ群:274306954 欢迎您的加入.

android sd卡挂载广播,Android--检测内置/外置SD卡存储卡,枚举所有挂载点(通过反射实现),监听SD卡广播...相关推荐

  1. android P监听SD卡热插拔执行symlink软链接的实现

    收到个android P项目的需求,要求监听SD卡hotplug热插拔,执行symlink软链接和unlink. 先看下运行效果: 拔SD卡时打印: ja310_evb:/ # logcat |gre ...

  2. Android 监听SD卡插入与拔出

    Android 监听SD卡插入与拔出 简单记录一下Android 如何监听SD卡插入与拔出,注意事项: 继承广播: public class SdStatusReceiver extends Broa ...

  3. android sim卡插拔广播,Android监听SIM卡插拔的方式

    监听SIM卡是否可用 import android.app.Service; import android.content.BroadcastReceiver; import android.cont ...

  4. android监听卡1电话,Android 监听 SIM 卡状态

    判断是否包含 SIM 卡 /** * 判断是否包含SIM卡 * * @return 状态 */ public static boolean hasSimCard(Context context) { ...

  5. 双SIM卡,Android监听SIM卡状态

    最近在搞一个项目,其中有一块关于双SIM卡状态监听,在这一块上没有经验,在网上找了很多例子,但都是只是监听SIM卡改变状态,而我要的是不但要监听SIM状态改变,而且还要知道具体是哪张SIM卡状态改变, ...

  6. android 监听多个广播,同一个广播接收器监听多个广播及多个广播接收器监听同一个广播...

    1.  同一个广播接收器可以同时监听多个广播,同一个广播发出后也可被多个广播接收器监听,就像一个电台可以被 多个收音机收到一样 2.  当使用同一个广播接收器接收多个广播时可以在AndroidMani ...

  7. 三星 SAMSUNG GT-S7572 内置/外置SD替换方法

    三星 SAMSUNGGT-S7572 内置/外置SD替换方法 1.      需要先root手机,网上教程很多,如:360一键root工具等: 2.      三星官网下载S7572 rom,使用bo ...

  8. C# Winform 多线程监听IC卡读卡器

     本文原创,转载请注明出处! 我们使用IC读卡器时,一般可分为手动读卡和自动监听读卡两种方式. 其中手动读卡根据IC设备厂商提供的Demo修改一下便可实现,相对简单,本文不做过多介绍. 而自动监听读卡 ...

  9. Android在未root手机获取应用内置的SQLite数据库到电脑上处理的方法(数据库备份与恢复-支持SDK30+)

    在android中我们常用sqlite数据库来存放文件,在开发中我们可能需要查看数据库中的所有的数据,以保证数据的准确性.在已经root的手机下,我们可以进入 data/data/包名/databas ...

最新文章

  1. 双圆弧插值算法(二)
  2. 不到顶会现场也能听论文讲解?这个视频集合网站值得收藏
  3. php流导出excel内存溢出,phpExcel导出大量数据出现内存溢出错误的解决方法
  4. 使用aSpotCat控制您的Android应用权限
  5. React中路由组件与一般组件
  6. 微软面试题系列(三):求子数组的最大和
  7. java语言乘号_java的编码样式、运算符运算对象
  8. eclipse Maven配置
  9. Netty-Pipeline组件
  10. Android 网络评分机制
  11. Atitit web 之道 艾龙著 Atitit web 之道 艾龙艾提拉著v2 saa.docx Atitit web开发之道 attilax著 Web应用 1. 第1章 Web编程基础知识 (
  12. 账龄分析表excel模板_这种高端表格模板你会做吗?Excel制作带照片的员工信息查询表...
  13. 软件测试之测试计划案例
  14. 校验码(循环冗余校验码)
  15. JavaScript数据类型 - Undefined类型
  16. HDU 2102 拯救公主
  17. 诺禾:和Java一样能用汉字编程的神奇语言
  18. python爬虫——爬取豆瓣top250电影信息
  19. python中的与或非详解
  20. uniapp 打包时报错:云端服务器返回错误,此应用DClound的Appdid非当前账号所有。

热门文章

  1. oracle索引的监控
  2. spark 上下游shuffle结果的存放获取
  3. Dubbo服务暴露的流程
  4. PDOStatement::bindParam的一个陷阱
  5. 详解SESSION与COOKIE的区别
  6. libuv 和 libev的对比
  7. c语言计算成绩大于90为优秀,输入一个分数,如小于60分,则输出不及格;如大于60小于85,输出良好;85分以上则为优秀。 用c语言编写...
  8. 深度学习 AI入门-1
  9. 什么是Knative
  10. springboot集成与使用Sentinel