Android 7.1 系统的工控机读取或者写入文件到U盘时,出现Permission denied 或者 No such file or directory 问题的解决方法

AndroidManifest.xml之前已经加入了以下权限

<!-- 允许应用程序读取设备外部存储 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 允许应用程序写入设备外部存储 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

然后在写入文件到U盘的过程中,出现如下错误

java.io.FileNotFoundException: /storage/001A-DE3C/x.png (Permission denied)
java.io.FileNotFoundException: /storage/001A-DE3C/Detection/report/x.png (No such file or directory)

解决方法就是还需要添加下面的权限才可以

<!-- 允许应用程序向外部存储设备写入媒体文件,用于解决无法写入文件到U盘的问题 -->
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />

最后分享一个获取设备上的USB路径列表的方法

/**
 * 获取挂载在设备上的USB路径列表
 *
 * @param context 上下文对象
 * @return 挂载在设备上的USB路径列表
 */
public static List < String > getUsbPathList(Context context) {
    List<String> usbPathList = new ArrayList<>();
    StorageManager storageManager =(StorageManager) context . getSystemService (Context.STORAGE_SERVICE);
    try {
        Method methodVolumeList = StorageManager .class.getMethod("getVolumeList");
        methodVolumeList.setAccessible(true);
        Object[] volumeList =(Object[]) methodVolumeList . invoke (storageManager);
        if (null == volumeList) {
            return null;
        }

        for (Object o: volumeList) {
            String path =(String) o . getClass ().getMethod("getPath").invoke(o);
            boolean isRemovable =(boolean) o . getClass ().getMethod("isRemovable").invoke(o);
            String state =(String) o . getClass ().getMethod("getState").invoke(o);
            if (isRemovable && "mounted".equalsIgnoreCase(state) && path.contains("storage")) {
                usbPathList.add(getCorrectPath(path));
            }
        }
    } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
        e.getLocalizedMessage();
    }
    return usbPathList;
}

/**
 * 根据从{@link getUsbPathList(Context)}获取到的路径来获取USB真正的路径
 *
 * @param path 从{@link getUsbPathList(Context)}获取到的路径
 * @return USB真正的路径
 */
private static String getCorrectPath(String path) {
    if (TextUtils.isEmpty(path)) {
        return path;
    }

    int lastSeparator = path . lastIndexOf (File.separator);
    String endString = path . substring (lastSeparator + 1);
    if (TextUtils.isEmpty(endString)) {
        return path;
    }

    String usbDisk = "USB_DISK";
    String anotherUsbDisk = "usb_disk";
    if (endString.contains(usbDisk) || endString.contains(anotherUsbDisk)) {
        File file = new File(path);
        if (!file.exists()) {
            return path;
        }

        File[] files = file . listFiles ();
        if (null == files || 0 == files.length) {
            return path;
        }

        for (File f: files) {
            // 如果有多个路径,就获取第一个存在的路径.
            if (f.isDirectory()) {
                return f.getAbsolutePath();
            }
        }
    }
    return path;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值