Android U盘插拔监听详细版以及U盘写入权限解决办法

首先,代码都是用在项目里的,肯定是可用的。踩过的一些坑一起会写在下面。如果有更好的方法,请告知我。

用广播接收U盘插板的状态,其中插板的判断可以加入"android.intent.action.MEDIA_MOUNTED".equals(action)
&& "/storage/usbdrive".equals(path)

其中”/storage/usbdrive”是我修改过的U盘的挂载路径,根据你们自己系统的路径进行修改。

<receiver android:name=".receiver.USBDiskReceiver">
            <intent-filter android:priority="1000" >
                <action android:name="android.intent.action.MEDIA_MOUNTED" />
                <action android:name="android.intent.action.MEDIA_UNMOUNTED" />

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

public class USBDiskReceiver extends BroadcastReceiver {
    public SharedPreferences cacheSp;

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        String path = intent.getData().getPath();
        if (!TextUtils.isEmpty(path)){
            if ("android.intent.action.MEDIA_UNMOUNTED".equals(action)) {
                Log.d("usb",unmounted);
            }
            if ("android.intent.action.MEDIA_MOUNTED".equals(action)) {
                Log.d("usb",mounted);
            }
        }


    }
}

用这个方法是没有办法判断U盘是不是已经挂载上了,比如开机前别人就插上了U盘。
提供两个方法判定U盘是不是插入了:
1、提供一个方法,原理是U盘在挂载上的时候会在/proc/mounts里写入U盘的挂载路径,所以我的path传入”/storage/usbdrive”即可判定

public class USBDiskState {
    private static final String MOUNTS_FILE = "/proc/mounts";

    public static boolean isMounted(String path) {
        boolean blnRet = false;
        String strLine = null;
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(MOUNTS_FILE));

            while ((strLine = reader.readLine()) != null) {
                if (strLine.contains(path)) {
                    blnRet = true;
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                reader = null;
            }
        }
        return blnRet;
    }

}

2、这是一种更简单粗暴的方法,android在U盘插入的时候会自动生成一个LOST.DIR的文件夹,所以直接判断目录下是否有文件也行file.listFiles().length == 0。

几个方法结合使用,效果更佳。


读U盘内容是没问题,再说说写入U盘权限的问题。
也是两个方法,自用第一条。。
1、因为我们是自研版,所以写出来的应用是系统级别的,添加了一条系统权限就行了

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

2、可以参考
Android实现识别/挂载U盘

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android中可以通过注册U盘插拔监听广播来实现对U盘插拔事件的监听。具体的实现步骤如下: 1. 在AndroidManifest.xml文件中添加如下权限: ``` <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 2. 在AndroidManifest.xml文件中添加如下广播接收器: ``` <receiver android:name=".UsbReceiver"> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" /> </intent-filter> </receiver> ``` 3. 在UsbReceiver.java文件中实现广播接收器: ``` public class UsbReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { // U盘插入 Toast.makeText(context, "U盘已插入", Toast.LENGTH_SHORT).show(); } else if (action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) { // U盘拔出 Toast.makeText(context, "U盘已拔出", Toast.LENGTH_SHORT).show(); } } } ``` 注意:在Android 6.0及以上本中,需要动态获取读取外部存储的权限。可以使用如下代码实现: ``` if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值