Reputation: 982
When I try to open a file that I selected via an Intent I get this error:
java.io.FileNotFoundException: /document/primary:Android/data/com.oli.myapp/Files/test.xml: open failed: ENOENT (No such file or directory)
I don't know why this happens. The file exists because I selected it. Here is my Code:
File selection:
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);
Code to get it:
@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;
}
}
EDIT:
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
}
Upvotes: 3
Views: 1599
Reputation: 1006634
ACTION_GET_CONTENT
gives you a Uri
. What the user chooses through ACTION_GET_CONTENT
does not have to be a file at all, let alone one you can access. In this case, you are getting a Uri
back with a content
scheme, which is very common.
Use a ContentResolver
and methods like getInputStream()
to work with the content represented by that Uri
.
Upvotes: 3