java.io.IOException:打开失败:在API级别23中写入文件时,EACCES(权限被拒绝) [英] java.io.IOException: open failed: EACCES (Permission denied) when writing file in API level 23

查看:113
本文介绍了java.io.IOException:打开失败:在API级别23中写入文件时,EACCES(权限被拒绝)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将数据库导出到CSV文件.我已将适当的权限应用于AndroidManifest.xml.我只是想知道为什么我不能在(实际设备)Nexus 5X API级别23中写入/创建文件,而在我的模拟器Nexus 7 API级别22中可以使用相同的代码?

代码如下:

private void writeCsv() {
    File fileDir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(),
             File.separator + "Example");
    if (!fileDir.exists()) {
        try {
                fileDir.mkdirs();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(),
            File.separator
            + "Example"
            + File.separator
            + (new Date()) + ".csv");
    if (!file.exists()) {
        try {
            file.createNewFile(); // THIS IS WHERE THE EXCEPTION POINTS OUT
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    if (file.exists()) {
        try {
            FileWriter fileWriter = new FileWriter(file);
            BufferedWriter bfWriter = new BufferedWriter(fileWriter);

            bfWriter.write("Id,Text,Timestamp\n");
            mDatabase.getWritableDatabase();
            List<Text> texts = mDatabase.getAllTexts();
            for (Text text : texts) {
                bfWriter.write(text.getId() + "," + text.getText()
                        + "," + text.getTimestamp() + "\n");
            }

            bfWriter.close();
            mDatabase.close();

            Toast.makeText(getActivity(),
                    "Texts exported to " + file.getAbsolutePath(),
                    Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我的AndroidManifest:

<application
...
</application>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这是日志:

01-21 22:55:22.589 25530-25530/com.example.android W/System.err: java.io.IOException: open failed: EACCES (Permission denied)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at java.io.File.createNewFile(File.java:939)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at com.example.android.settings.SettingsPage.writeCsv(SettingsPage.java:166)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at com.example.android.settings.SettingsPage.onClick(SettingsPage.java:89)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at android.view.View.performClick(View.java:5204)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at android.view.View$PerformClick.run(View.java:21153)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at android.os.Looper.loop(Looper.java:148)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5417)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
01-21 22:55:22.602 25530-25530/com.example.android W/System.err:     at libcore.io.Posix.open(Native Method)
01-21 22:55:22.602 25530-25530/com.example.android W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
01-21 22:55:22.603 25530-25530/com.example.android W/System.err:     at java.io.File.createNewFile(File.java:932)
01-21 22:55:22.603 25530-25530/com.example.android W/System.err:    ... 11 more

解决方案

否,仅在针对Api23时声明权限是不够的.

您必须在运行时从棉花糖开始请求权限.

http://developer.android.com/training/permissions/requesting.html

您现在可以通过将Api 22(而不是23)定位为目标

I'm trying to export my DB to a CSV file. I have applied the appropriate permission to the AndroidManifest.xml. I'm just wondering why I can't write/create the file in my (actual device) Nexus 5X API level 23 where the same code works in my emulator Nexus 7 API level 22. Is the permission not enough?

Here's the code:

private void writeCsv() {
    File fileDir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(),
             File.separator + "Example");
    if (!fileDir.exists()) {
        try {
                fileDir.mkdirs();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(),
            File.separator
            + "Example"
            + File.separator
            + (new Date()) + ".csv");
    if (!file.exists()) {
        try {
            file.createNewFile(); // THIS IS WHERE THE EXCEPTION POINTS OUT
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    if (file.exists()) {
        try {
            FileWriter fileWriter = new FileWriter(file);
            BufferedWriter bfWriter = new BufferedWriter(fileWriter);

            bfWriter.write("Id,Text,Timestamp\n");
            mDatabase.getWritableDatabase();
            List<Text> texts = mDatabase.getAllTexts();
            for (Text text : texts) {
                bfWriter.write(text.getId() + "," + text.getText()
                        + "," + text.getTimestamp() + "\n");
            }

            bfWriter.close();
            mDatabase.close();

            Toast.makeText(getActivity(),
                    "Texts exported to " + file.getAbsolutePath(),
                    Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

My AndroidManifest:

<application
...
</application>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Here's the log:

01-21 22:55:22.589 25530-25530/com.example.android W/System.err: java.io.IOException: open failed: EACCES (Permission denied)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at java.io.File.createNewFile(File.java:939)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at com.example.android.settings.SettingsPage.writeCsv(SettingsPage.java:166)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at com.example.android.settings.SettingsPage.onClick(SettingsPage.java:89)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at android.view.View.performClick(View.java:5204)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at android.view.View$PerformClick.run(View.java:21153)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at android.os.Looper.loop(Looper.java:148)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5417)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-21 22:55:22.599 25530-25530/com.example.android W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
01-21 22:55:22.602 25530-25530/com.example.android W/System.err:     at libcore.io.Posix.open(Native Method)
01-21 22:55:22.602 25530-25530/com.example.android W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
01-21 22:55:22.603 25530-25530/com.example.android W/System.err:     at java.io.File.createNewFile(File.java:932)
01-21 22:55:22.603 25530-25530/com.example.android W/System.err:    ... 11 more

解决方案

No, declaring the permission is not enough when targeting Api23.

You have to request the permissions at runtime in Marshmallow onwards.

http://developer.android.com/training/permissions/requesting.html

You can get around this for now by targeting Api 22 instead of 23

这篇关于java.io.IOException:打开失败:在API级别23中写入文件时,EACCES(权限被拒绝)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆