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

直接上重点:

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;

}

我的运行结果如下:

92dc646990b0

这里写图片描述

(图中中文是检测挂载的方法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 欢迎您的加入.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 2.3 版本中,可以通过监听系统广播实现 SD 卡和 U 盘的自动挂载。具体步骤如下: 1. 在 AndroidManifest.xml 文件中添加以下权限和接收器: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <receiver android:name=".UsbReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_MOUNTED" /> <action android:name="android.intent.action.MEDIA_UNMOUNTED" /> <action android:name="android.intent.action.MEDIA_EJECT" /> <action android:name="android.intent.action.MEDIA_REMOVED" /> <action android:name="android.intent.action.MEDIA_BAD_REMOVAL" /> <data android:scheme="file" /> </intent-filter> </receiver> ``` 2. 创建 UsbReceiver 类,并在 onReceive 方法中处理挂载和卸载广播: ```java public class UsbReceiver extends BroadcastReceiver { private static final String TAG = "UsbReceiver"; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Uri uri = intent.getData(); String path = uri.getPath(); if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) { Log.d(TAG, "U盘已挂载,路径为:" + path); // 执行挂载后的操作 } else if (action.equals(Intent.ACTION_MEDIA_UNMOUNTED)) { Log.d(TAG, "U盘已卸载,路径为:" + path); // 执行卸载后的操作 } } } ``` 3. 在 MainActivity 中注册 UsbReceiver,如下: ```java public class MainActivity extends AppCompatActivity { private UsbReceiver usbReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册 UsbReceiver usbReceiver = new UsbReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_MOUNTED); filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); filter.addDataScheme("file"); registerReceiver(usbReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); // 注销 UsbReceiver unregisterReceiver(usbReceiver); } } ``` 以上三个步骤即可实现 Android 2.3 版本下的 SD 卡和 U 盘自动挂载。需要注意的是,由于不同设备的 U 盘挂载可能不同,因此需要根据实际情况进行路径的获取和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值