文章目录
前言
记录于此,方便自己查阅。
好记性不如烂笔头
如下提示:
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;
}
