从Android中的外部存储打开文件

时间:2016-12-02 16:13:24

标签: android file

这可能是一个快速修复,但目前我无法让这个工作......

我有一个asynctask,我正在解析XML文件。如果我将一个XML文件放在assets文件夹中,我可以打开并解析它没问题。

但是如果我尝试从外部存储打开XML文件就会失败。

这是我的asynctask:

private class async extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
    while (!isCancelled()) {

     try {
         NodeList nList;
         Node node;

         InputStream is = getAssets().open("file.xml");
         // this works

         File is = new File("/storage/emulated/0/test.xml");
         // this fails

         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
         Document doc = dBuilder.parse(is);

我收到此错误:

I/System.out: File path: /storage/emulated/0/test.xml
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/test.xml (Permission denied)

这些权限在我的清单中:

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

有人能告诉我为什么会收到此错误吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

我看到了您的错误消息:

  

java.io.FileNotFoundException:/storage/emulated/0/test.xml   (许可被拒绝)

请记住,在尝试读取或写入外部存储空间之前,运行Android 6.0时,必须实现 runtime permissions

对于使用Android 6.0 +的设备,

将此设置为manifest.xml是不够的:

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

答案 1 :(得分:1)

您不应该对路径进行硬编码。你可以试试这个:

String path = Environment.getExternalStorageDirectory() + File.separator + MY_DIR_NAME + File.separator + "file.xml"

答案 2 :(得分:0)

您不应尝试使用绝对路径访问文件系统。

要检索SD卡的路径,您可以使用:

Environment.getExternalStorageDirectory()

因此,如果要创建名为test.xml的文件

new File(Environment.getExternalStorageDirectory(),"test.xml");