content://
Uri 不一定指向 sdcard 上的文件。它更有可能指向存储在数据库中的任何类型的数据,或者指向允许您访问另一个应用程序的私有文件存储的内容提供者。
我认为后一种情况是邮件附件的情况(如果内容提供商没有直接从 Web 服务器请求它)。所以将content://
Uri 转换为路径是行不通的。
我做了以下(不确定它是否也适用于 k9 邮件应用程序)
Uri uri = intent.getData();
if (uri.getScheme().equals("content")) {
String fileName = ContentProviderUtils.getAttachmentName(this, uri);
if (fileName.toLowerCase().endsWith(".ext")) {
InputStream is = this.getContentResolver().openInputStream(uri);
// do something
} else {
// not correct extension
return;
}
} else if (uri.getScheme().equals("file")) {
String path = uri.getPath();
if (path.toLowerCase().endsWith(".ext")) {
InputStream is = new FileInputStream(path);
// do something
} else {
// not correct extension
return;
}
}
附件名称可以通过以下方式找到
public static String getAttachmentName(Context ctxt, Uri contentUri) {
Cursor cursor = ctxt.getContentResolver().query(contentUri, new String[]{MediaStore.MediaColumns.DISPLAY_NAME}, null, null, null);
String res = "";
if (cursor != null){
cursor.moveToFirst();
int nameIdx = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
res = cursor.getString(nameIdx);
cursor.close();
}
return res;
}