c语言实现存储设备的获取,android6.0 外部存储设备插拔广播以及获取路径(U盘)【转】...

这里我将U盘作为例子来说明解析。

android4.1版本时U盘插拔时的广播

在android4.1时我们可以用以下的BroadcastReceiver接收U盘广播。

1

2

3

4

5

6

7

8

android6.0版本时U盘插拔时的广播

但是由于业务需求,当换成6.0的安卓系统后,会发现接收不到U盘插拔的广播。

在此之前我尝试了使用USBManager

intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);

intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);

1

2

但是我发现U盘一插进去就发出这个广播,而不是等到U盘加载好后发出这个广播,于是我又去研究其他的方法。

在查询安卓6.0的源码发现了VolumeInfo这个类,记录存储设备的状态信息。

VolumeInfo类下面有几个常量表示当前的存储设备的状态。

public static final int STATE_UNMOUNTED = 0;

public static final int STATE_CHECKING = 1;

public static final int STATE_MOUNTED = 2;

public static final int STATE_MOUNTED_READ_ONLY = 3;

public static final int STATE_FORMATTING = 4;

public static final int STATE_EJECTING = 5;

public static final int STATE_UNMOUNTABLE = 6;

public static final int STATE_REMOVED = 7;

public static final int STATE_BAD_REMOVAL = 8;

1

2

3

4

5

6

7

8

9

以及广播的Action以及接受广播的key

public static final String ACTION_VOLUME_STATE_CHANGED =

"android.os.storage.action.VOLUME_STATE_CHANGED";

public static final String EXTRA_VOLUME_ID =

"android.os.storage.extra.VOLUME_ID";

public static final String EXTRA_VOLUME_STATE =

"android.os.storage.extra.VOLUME_STATE";

1

2

3

4

5

6

这里我做了一个简单的程序用来检验对U盘插拔的状态进行检测。

if(action.equals("android.os.storage.action.VOLUME_STATE_CHANGED")){

int i = intent.getIntExtra(VolumeInfo.EXTRA_VOLUME_STATE,VolumeInfo.STATE_UNMOUNTED);

Log.d("zcx","action="+action+" state="+i);

}

1

2

3

4

当插入U盘后显示的Logcat如下所示:

c24daa3d56ea1b1d87584e6fd943dbac.png 

U盘的state从STATE_UNMOUNTED→STATE_MOUNTED

当拔出U盘后显示的Logcat如下所示:

6210178fd587ef78261b40bd13bc3302.png 

U盘的state从STATE_EJECTING →STATE_UNMOUNTED→STATE_BAD_REMOVAL。

android6.0版本获取U盘路径

由于6.0版本会根据U盘的型号来划分各自的路径,我的方法是通过StorageManager的getVolumes()就能取得外部设备的状态信息,从而获取到U盘路径。

VolumeInfo中包含Type以及DiskInfo信息。

public static final int TYPE_PUBLIC = 0;

public static final int TYPE_PRIVATE = 1;

public static final int TYPE_EMULATED = 2;

public static final int TYPE_ASEC = 3;

public static final int TYPE_OBB = 4;

1

2

3

4

5

U盘的Type是TYPE_PUBLIC,然后再通过DiskInfo的isUsb()方法即可判断当前是否为U盘。

List list = mStorageManager.getVolumes();

for (VolumeInfo volumeInfo : list) {

if (volumeInfo.getType() == 0) {

DiskInfo diskInfo = volumeInfo.getDisk();

if (diskInfo != null && (diskInfo.isUsb())) {

int i = volumeInfo.getState();

//volumeInfo.getPath()通过这个方法就能取得路径

//这里的Volume就是U盘的信息了

}

}

}

1

2

3

4

5

6

7

8

9

10

11

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值