这可能是一个快速修复,但目前我无法让这个工作......
我有一个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" />
有人能告诉我为什么会收到此错误吗?
谢谢!
答案 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");