【发布时间】:2017-09-26 09:31:25
【问题描述】:
尝试转换我从Intent.ACTION_GET_CONTENT 获得的URI,输入流对本地文件打开正常,但对于来自驱动器 (/document/acc=1;doc=4089) 的URI,我得到一个FileNotFoundException,说文件是“虚拟的”。如何打开此类文件的输入流?
获取 URI:
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.setType("*/*"); //No I18N
try{
startActivityForResult(Intent.createChooser(i, "Pick a file"), REQUEST_CODE_UPLOAD_FILE_FOR_IMPORT);
}catch (android.content.ActivityNotFoundException ex){
Log.e("Error","FileManager not found!");
}
和
importedFileUri = data.getData();
System.out.println("URI path: "+importedFileUri.getPath()+" "+importedFileUri.getEncodedPath());
System.out.println("URI Scheme "+importedFileUri.getScheme());
System.out.println("URI Authority :"+importedFileUri.getAuthority());
System.out.println("URI Fragment :"+importedFileUri.getFragment());
System.out.println("URI path segments : ");
for(String str : importedFileUri.getPathSegments()){
System.out.println("\t" +str );
}
String ext;
if (importedFileUri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
final MimeTypeMap mime = MimeTypeMap.getSingleton();
ext = mime.getExtensionFromMimeType(mActivity.getContentResolver().getType(importedFileUri));
System.out.println("resolved type (content) : "+ mActivity.getContentResolver().getType(importedFileUri));
} else {
ext = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(importedFileUri.getPath())).toString());
System.out.println("resolved type (other) : "+ Uri.fromFile(new File(importedFileUri.getPath())).toString());
}
获取输入流:
InputStream is = null;
try {
is = contentResolver.openInputStream(importedFileUri);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
结果:
URI 路径:/document/acc=1;doc=4089 /document/acc%3D1%3Bdoc%3D4089
获取字符串 - content://com.google.android.apps.docs.storage/document/acc%3D1%3Bdoc%3D4089
URI 方案内容
URI 授权:com.google.android.apps.docs.storage
URI 片段:null
URI 路径段:
文档
acc=1;doc=4089
解析的类型(内容):application/vnd.google-apps.spreadsheet
分机:空
例外:
java.io.FileNotFoundException:文件是虚拟的:acc=1;doc=4089
【问题讨论】:
-
当然可以。请出示您的代码。
-
but for URI from drive (/document/acc=1;doc=4089) I那不是 uri。没有内容方案。请说出完整的方案。 -
@greenapps 这是我的代码和结果
-
你也应该打印
importedFileUri.toString()。因为那是真正的内容方案。 -
Trying to convert a URI。我没有看到您正在尝试更改 uri。这当然不需要。
标签: android file cloud uri android-contentprovider