前言

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)

 历史上的今天

  1. 2024: Android焦点杂想(0条评论)
  2. 2024: 触发了v2ex.com某些机制,被禁止访问(1条评论)
  3. 2020: 胡适 :过有意思的生活(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

陈独秀:人生的真义

人生在世,究竟为的甚么?究竟应该怎样?这两句话实在难得回答的很,我们若是不能回答这两句话,糊糊涂涂过了一生,岂不是太无意识吗?自古以来,说明这个道理的人也算不少,大概约有数种:第一是宗教家,像那佛教家说:世界本来是个幻象,人生本来无生;“真如”本性为“无明”所迷,才现出一切生灭幻象;一旦“无明”灭,...

C语言输出格式符

前言简单记录一下C语言中输出格式符正文C语言中常用的打印方式:printf("%d", a);除了d,还有其他的格式符,下面简单记录一下。十进制整数%d%i举个例子,也就是:printf("%i", a);PS: 后续的类似,不在举例十进制 无符号整数%u十六进...

朱自清:冬天

说起冬天,忽然想到豆腐。是一“小洋锅”(铝锅)白煮豆腐,热腾腾的。水滚着,像好些鱼眼睛,一小块一小块豆腐养在里面,嫩而滑,仿佛反穿的白狐大衣。锅在“洋炉子”(煤油不打气炉)上,和炉子都熏得乌黑乌黑,越显出豆腐的白。这是晚上,屋子老了,虽点着“洋灯”,也还是阴暗。围着桌子坐的是父亲跟我们哥儿三个。“洋...

丰子恺:渐

不为“渐”所迷,不为造物所欺,而收缩无限的时间并空间于方寸的心中。故佛家能纳须弥于芥子。使人生圆滑进行的微妙的要素,莫如“渐”;造物主骗人的手段,也莫如“渐”。在不知不觉之中,天真烂漫的孩子“渐渐”变成野心勃勃的青年;慷慨豪侠的青年“渐渐”变成冷酷的成人;血气旺盛的成人“渐渐”变成顽固的老头子。因为...

Launcher2导入Eclipse

在分析源码中,除了使用Source Insight 这个强大的软件外,有些应用还是用编译器看源码是最好的,因此今天我们学习一下如何导入源码到Eclipse中。这里主要是讲正确把Android 6.0 的Launcher2 导入Eclipse中并运行和安装应用。工具: Eclipse,L...

git diff提示filemode发生改变

在使用git的时候遇到的,因此摘抄于此。今天clone代码,git status显示修改了大量文件,git diff提示filemode变化,如下:diff --git a/Android.mk b/Android.mkold mode 100644new mode 100755原...