android 监听u盘插拔

本文详细介绍了在Android5.1及6.0环境下监听U盘插拔事件的方法,包括使用BroadcastReceiver接收各种与U盘相关的广播,如插拔、挂载和卸载,并提供了具体的代码实现和注册方式。

android 5.1 下 u盘插拔 

/**
 * 用于监听android 5.1 的u盘插拔
 */
public class USBdiskReceiver51 extends BroadcastReceiver {
    private static final String TAG = "USBdiskReceiver51";

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String action = intent.getAction();
        String path = intent.getData().getPath();
        Log.e(TAG, action);
        if (action.equals(VolumeInfo.ACTION_USB_DEVICE_ATTACHED)) {
            // Log.e("action===", "装载");
        } else if (action.equals(VolumeInfo.ACTION_USB_DEVICE_DETACHED)) {
            //Log.d("action===", "卸载USB");
        }  else if (Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) {
            //Log.d(MainActivity.TAG, "ACTION_MEDIA_UNMOUNTED");
            // processUnmountedMessage(context, bundle);
        } else if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) {
            //Log.d(MainActivity.TAG, "ACTION_MEDIA_MOUNTED");
            processMountedMessage(context, path);
        } else if (action.equals(Intent.ACTION_MEDIA_REMOVED)) {
            //Log.d(MainActivity.TAG, "ACTION_MEDIA_REMOVED");
            // processUnmountedMessage(context, bundle);
        }
    }

    private void processUnmountedMessage(Context context, Bundle bundle) {

        Intent mIntent = new Intent(MainActivity.ACTION_USB_RECEIVER);
        mIntent.putExtra("message", "false");
        context.sendBroadcast(mIntent);

    }

    private void processMountedMessage(Context context, String path) {
        Log.e(TAG, "path ==>>" + path);
        if (util.isPathExist(path)) {
            Log.e(TAG, "into processMountedMessage isPathExist true");
            Intent intent = new Intent(MainActivity.ACTION_USB_RECEIVER);
            intent.putExtra("data", "USB_MOUNT");
            intent.putExtra("path", path);
            LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
            //发送本地广播
            localBroadcastManager.sendBroadcast(intent);
        }
    }
}

注册:

<receiver android:name=".USBdiskReceiver51">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.MEDIA_MOUNTED" />
                <action android:name="android.intent.action.MEDIA_UNMOUNTED" />
                <action android:name="android.intent.action.MEDIA_REMOVED" />
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />

                <data android:scheme="file" />
            </intent-filter>
        </receiver>

 

android 6.0 下 监听u盘插拔:

添加权限:

<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />

public class USBdiskReceiver extends BroadcastReceiver {
    private static final String TAG = "USBdiskReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String action = intent.getAction();
        Log.e("action===", action);
        if (action.equals(VolumeInfo.ACTION_USB_DEVICE_ATTACHED)) {
            // Log.e("action===", "装载");
        } else if (action.equals(VolumeInfo.ACTION_USB_DEVICE_DETACHED)) {
            //Log.d("action===", "卸载USB");
        } else if (action.equals(VolumeInfo.ACTION_VOLUME_STATE_CHANGED)) {
            int intExtra = intent.getIntExtra(VolumeInfo.EXTRA_VOLUME_STATE, VolumeInfo.STATE_UNMOUNTED);
            Log.e("action===", "ACTION_VOLUME_STATE_CHANGED=intExtra=>>" + intExtra);
            if (intExtra == VolumeInfo.STATE_MOUNTED) {
                processMountedMessage(context);
            }
        }
    }

    private void processUnmountedMessage(Context context, Bundle bundle) {

        Intent mIntent = new Intent(MainActivity.ACTION_USB_RECEIVER);
        mIntent.putExtra("message", "false");
        context.sendBroadcast(mIntent);

    }

    private void processMountedMessage(Context context) {
        String path = util.getStoragePath(context);
        if (util.isPathExist(path)) {
            Log.e(TAG, "into processMountedMessage isPathExist true");
            Intent intent = new Intent(MainActivity.ACTION_USB_RECEIVER);
            intent.putExtra("data", "USB_MOUNT");
            intent.putExtra("path", path);
            LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
            //发送本地广播
            localBroadcastManager.sendBroadcast(intent);
        }
    }

}
VolumeInfo:
package com.example.petrochina_oil;

public class VolumeInfo {
    /**
     * U盘挂载类型  插入U盘 STATE_UNMOUNTED->STATE_MOUNTED;拔出U盘  STATE_EJECTING->STATE_UNMOUNTED->STATE_BAD_REMOVAL
     */
    //卸载
    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;
    /**
     * 接受广播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";
    /**
     * 刚挂载和关闭
     */
    public static final String ACTION_USB_DEVICE_ATTACHED= "android.hardware.usb.action.USB_DEVICE_ATTACHED";
    public static final String ACTION_USB_DEVICE_DETACHED= "android.hardware.usb.action.USB_DEVICE_DETACHED";
}

 

注册:

<receiver android:name=".USBdiskReceiver">
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
                <action android:name="android.os.storage.action.VOLUME_STATE_CHANGED" />
            </intent-filter>
        </receiver>

android 6.0 下u盘加载后获取路径:

public static String getStoragePath(Context context) {
        String storagePath = null;
        StorageManager mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
        try {
            Class storeManagerClazz = Class.forName("android.os.storage.StorageManager");
            Method getVolumesMethod = storeManagerClazz.getMethod("getVolumes");
            List<?> volumeInfos = (List<?>) getVolumesMethod.invoke(mStorageManager);//获取到了VolumeInfo的列表
            Class volumeInfoClazz = Class.forName("android.os.storage.VolumeInfo");
            Method getFsUuidMethod = volumeInfoClazz.getMethod("getFsUuid");
            Field pathField = volumeInfoClazz.getDeclaredField("path");
            if (volumeInfos != null) {
                for (Object volumeInfo : volumeInfos) {
                    String uuid = (String) getFsUuidMethod.invoke(volumeInfo);
                    if (uuid != null) {
                        storagePath = (String) pathField.get(volumeInfo);
                    }
                }
            }

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        return storagePath;
    }

android 6.0 下正常情况会收不到   ACTION_VOLUME_STATE_CHANGED  消息,两个办法:

1、给应用加上系统key

2、修改源码 framework\base\services\core\java\com\android\server\pm\PackageManagerService.java

在 grantPermissionsLPw 方法的 case PermissionInfo.PROTECTION_SIGNATURE 中 
if (allowedSig ) 
修改为 
if (allowedSig || perm.equals(“android.permission.WRITE_MEDIA_STORAGE”) )


//下面的没试过,应该可行
这个if 为true 是关键,如果你想某个app可以申请全部权限 
if (allowedSig || pkg.packageName.equals(你APP包名)) 

参考:

https://blog.youkuaiyun.com/subingxi/article/details/81541167

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值