前言

Android项目中,做拷贝文件时出现如下错误。

记录于此,方便自己查阅。

好记性不如烂笔头

如下提示:

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;
    }

参考文章

  1. W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Download/20200813063004.txt: open
  2. System.err: java.io.FileNotFoundException: /storage/emulated/0/***(No such file or directory)

相关文章

暂无评论

none
暂无评论...