我收到一个FileNotFoundException,但文件在那里



当我尝试打开通过Intent选择的文件时,出现此错误:

java.io.FileNotFoundException: /document/primary:Android/data/com.oli.myapp/Files/test.xml: open 失败:ENOENT(没有这样的文件或目录)

我不知道为什么会这样。该文件存在,因为我选择了它。这是我的代码:

文件选择:

Intent chooseFileXML = new Intent(Intent.ACTION_GET_CONTENT);
Uri uri = Uri.parse(new Helper(FunctionsActivity.this).getPathToAppFolder());                
chooseFileXML.setDataAndType(uri, "text/xml");
Intent intentXML = Intent.createChooser(chooseFileXML, getString(R.string.importXMLDatei));
startActivityForResult(intentXML, REQUEST_CODE_IMPORT_XML_FILE);

获取它的代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    switch (requestCode){
        case REQUEST_CODE_IMPORT_XML_FILE:
            if(resultCode == RESULT_OK){
                String Fpath = data.getDataString();
                File file = new File(Fpath);
                Intent intent = new Intent(FunctionsActivity.this, CreateActivity.class);
                intent.setAction(Intent.ACTION_DEFAULT);
                intent.setData(Uri.parse(file.toURI().toString()));
                startActivity(intent);

            }
            break;
    }
}

编辑:

Uri uri = data.getData();
DocumentFile documentFile = DocumentFile.fromSingleUri(this, uri);
String type = documentFile.getType();
if(type.equals("text/xml")){
    try {
        InputStream inputStream = getContentResolver().openInputStream(uri);
        if(inputStream == null){
            throw new Exception();
        }
        BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder total = new StringBuilder();
        String line;
        while ((line = r.readLine()) != null) {
            total.append(line).append('n');
        }
        //Could read the file with no problems
        createWithXMLCode(total.toString());
    }catch (Exception e){
        e.printStackTrace();
        //TODO
    }
}else{
    //TODO
}

ACTION_GET_CONTENT给你一个Uri。用户通过ACTION_GET_CONTENT选择的内容根本不必须是文件,更不用说您可以访问的文件了。在这种情况下,您将获得content方案的Uri,这很常见。

使用ContentResolver和方法(如 getInputStream())来处理该Uri表示的内容。

相关内容

  • 没有找到相关文章