目录
前言
记录于此,方便自己查阅。
好记性不如烂笔头
如下提示:
System.err(16574): java.io.FileNotFoundException: /storage/emulated/0/media_favorite/BLACKPINK-Kill This Love.flac (No such file or directory) System.err(16574): at java.io.FileOutputStream.open0(Native Method) System.err(16574): at java.io.FileOutputStream.open(FileOutputStream.java:308) System.err(16574): at java.io.FileOutputStream.<init>(FileOutputStream.java:238) System.err(16574): at java.io.FileOutputStream.<init>(FileOutputStream.java:119) System.err(16574): at com.water.music.utils.MediaUtils.copyMediaFile(MediaUtils.java:116) System.err(16574): at com.water.music.MusicActivity$2.handleMessage(MusicMainActivity.java:333) System.err(16574): at android.os.Handler.dispatchMessage(Handler.java:102) System.err(16574): at android.os.Looper.loop(Looper.java:193) System.err(16574): at android.os.HandlerThread.run(HandlerThread.java:65)
总结
日志中其实提示很明白了
No such file or directory
我的这个问题就是该目录不存在,因此判断目录(/storage/emulated/0/media_favorite)是否存在,不存在就创建一下即可。
正文
这里整理一下网上说的可能存在的原因:
一、权限问题
我的在AndroidManifest.xml是配置了相关权限的
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
二、需要动态申请权限
我的是系统应用,所以不用担心这个问题。同时我也动态的申请了权限:
可以参考《Android 10上读取sdcard中的文件时出现open failed EACCES (Permission denied)》中的代码片段。
这里就不重复了。
三、/storage/emulated/0/media_favorite 这个没有读写权限
这个我测试过,我的是可以访问的。
四、没有创建/storage/emulated/0/media_favorite 这个目录
上面网上方式我尝试过后,还是不行,最后我使用命令创建了对应的目录,发现就可以了。
(尴尬,没有目录怎么可以拷贝进入呢!!)
因此加入如下代码:
File destDir = new File("/storage/emulated/0/media_favorite"); if (!destDir.exists()) { destDir.mkdirs(); }
文件拷贝代码片段
FAVORITE_PATH = "/storage/emulated/0/media_favorite";
/** * @param srcPath * @param mediaName * @return */ public static boolean copyFile(String srcPath, String mediaName) { if (TextUtils.isEmpty(srcPath)) { Log.d(TAG, "copyFile srcPath null."); return false; } File destDir = new File(FAVORITE_PATH); if (!destDir.exists()) { destDir.mkdirs(); } File destFile = new File(FAVORITE_PATH + "/" + mediaName); if (null != destFile && destFile.exists()) { Log.d(TAG, "copyFile srcPath file exist."); return true; } InputStream inputStream = null; FileOutputStream fileOutputStream = null; try { File file = new File(srcPath); if (null != file && file.exists()) { inputStream = new FileInputStream(srcPath); fileOutputStream = new FileOutputStream(FAVORITE_PATH + "/" + mediaName); byte[] buffer = new byte[1024]; int count = 0; while ((count = inputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, count); } buffer = null; return true; } } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != inputStream) { inputStream.close(); } if (null != fileOutputStream) { fileOutputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } return false; }
参考文章
© 版权声明