文件未找到,打开失败:EACCES(权限被拒绝)

4

当我尝试写入 "/mnt/sdcard/report/" 时,我在Android上遇到了 "open failed: EACCES (Permission denied)" 的问题。我的第一步是创建 "report" 文件夹,但它不起作用。然后我尝试写入,结果抛出上述异常。我已经将 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 设置为对等项(即应用标记之外)。当我在模拟器上运行JUnit仪器测试时,我遇到了这个错误。有什么想法吗?以下是代码。

        if (mReportDir == null) {
            if (mContext.getFilesDir() != null) {
                mOutputStream = mContext.openFileOutput(fileName, 0);
            } else {
                mOutputStream = mTargetContext.openFileOutput(fileName, 0);
            }
        } else {
            File f = new File(mReportDir);
            if (!f.exists()) {
                f.mkdirs();
            }
            mOutputStream = new FileOutputStream(new File(mReportDir, fileName));
        }

mReportDir等于"/mnt/sdcard/report",fileName等于"junit-report.xml",f.mkdirs返回false并且目录从未创建。我想知道为什么会出现权限被拒绝的情况。我正在尝试重用自定义JUnit测试运行器。

我已将hw.sdCard = yes添加到avd设置中。启动后,我进入shell并键入mount:

~$ adb shell
# mount
rootfs / rootfs ro 0 0
tmpfs /dev tmpfs rw,nosuid,mode=755 0 0
devpts /dev/pts devpts rw,mode=600 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
none /acct cgroup rw,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,cpu 0 0
/dev/block/mtdblock0 /system yaffs2 ro 0 0
/dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0
/dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0

我正在通过Ant脚本从程序中启动AVD。有什么可以在程序中做的来挂载SD卡吗?


你看过 https://dev59.com/IXI95IYBdhLWcg3w2h56 这个链接吗?特别是 WRITE_EXTERNAL_STORAGE 权限? - mah
是的,非常抱歉!SO在我的帖子中吃掉了uses-permissions标签。我已经编辑了帖子,请重新阅读。 :) - Cliff
你能展示一下你正在使用的代码来尝试创建目录吗?(因为你暗示它不存在,这是你当前失败的原因) - mah
我目前正在查看是否需要在启动模拟器时显式挂载SD卡。我目前是从命令行启动它。 - Cliff
2
/mnt/sdcard 是否等同于 Environment.getExternalStorageDirectory()? 如果不是,那么您可能成为了http://www.chainfire.eu/articles/113/Is_Google_blocking_apps_writing_to_SD_cards_的受害者。 - zapl
1
乍一看,你的代码看起来很好 - 我主要是想确保你正在调用mkdir() [或mkdirs(),因为你正在这样做]。至于在模拟器中挂载虚拟卡 - 这可能是问题所在。如果你使用adb shell,你可以输入命令mount来查看已挂载的内容。在我的模拟器上(没有虚拟SD卡),ls -l /mnt显示/mnt/sdcard根本没有访问权限 - d--------- system system 2012-09-12 10:55 sdcard - mah
1个回答

10

找到问题所在了!当我创建AVD时,我从未指定SD卡的大小。我编辑并设置了512MiB的大小,现在它可写了!感谢所有回复的人! :)


遇到了完全相同的问题。感谢分享。 - mish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接