当前位置:   article > 正文

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

android读取文件时(no such file or directory)

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

  1. <!-- 允许应用程序读取设备外部存储 -->
  2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  3. <!-- 允许应用程序写入设备外部存储 -->
  4. <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)

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

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

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

  1. /**
  2. * 获取挂载在设备上的USB路径列表
  3. *
  4. * @param context 上下文对象
  5. * @return 挂载在设备上的USB路径列表
  6. */
  7. public static List < String > getUsbPathList(Context context) {
  8. List<String> usbPathList = new ArrayList<>();
  9. StorageManager storageManager =(StorageManager) context . getSystemService (Context.STORAGE_SERVICE);
  10. try {
  11. Method methodVolumeList = StorageManager .class.getMethod("getVolumeList");
  12. methodVolumeList.setAccessible(true);
  13. Object[] volumeList =(Object[]) methodVolumeList . invoke (storageManager);
  14. if (null == volumeList) {
  15. return null;
  16. }
  17. for (Object o: volumeList) {
  18. String path =(String) o . getClass ().getMethod("getPath").invoke(o);
  19. boolean isRemovable =(boolean) o . getClass ().getMethod("isRemovable").invoke(o);
  20. String state =(String) o . getClass ().getMethod("getState").invoke(o);
  21. if (isRemovable && "mounted".equalsIgnoreCase(state) && path.contains("storage")) {
  22. usbPathList.add(getCorrectPath(path));
  23. }
  24. }
  25. } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
  26. e.getLocalizedMessage();
  27. }
  28. return usbPathList;
  29. }
  30. /**
  31. * 根据从{@link getUsbPathList(Context)}获取到的路径来获取USB真正的路径
  32. *
  33. * @param path 从{@link getUsbPathList(Context)}获取到的路径
  34. * @return USB真正的路径
  35. */
  36. private static String getCorrectPath(String path) {
  37. if (TextUtils.isEmpty(path)) {
  38. return path;
  39. }
  40. int lastSeparator = path . lastIndexOf (File.separator);
  41. String endString = path . substring (lastSeparator + 1);
  42. if (TextUtils.isEmpty(endString)) {
  43. return path;
  44. }
  45. String usbDisk = "USB_DISK";
  46. String anotherUsbDisk = "usb_disk";
  47. if (endString.contains(usbDisk) || endString.contains(anotherUsbDisk)) {
  48. File file = new File(path);
  49. if (!file.exists()) {
  50. return path;
  51. }
  52. File[] files = file . listFiles ();
  53. if (null == files || 0 == files.length) {
  54. return path;
  55. }
  56. for (File f: files) {
  57. // 如果有多个路径,就获取第一个存在的路径.
  58. if (f.isDirectory()) {
  59. return f.getAbsolutePath();
  60. }
  61. }
  62. }
  63. return path;
  64. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/448055?site
推荐阅读
相关标签
  

闽ICP备14008679号