我想要实现的是听起来很熟悉,它已经在Stack Overflow中多次发布,但是我无法完成它。
方案是,我收到一封附有自定义附加信息的附件的邮件。扩展程序由我的应用程序识别,它需要FilePath来处理它。
目前,当我使用getIntent().getData()
在我的应用中获得附件时,我得到的是content://
我见过将类型为content://
的媒体内容转换为FilePath的方法,如/sdcard/file.ext
,但我无法使用它转换附件。可能是显而易见的。
有没有办法在不实际下载的情况下处理content://
类型。
目前来自k9邮件应用程序,当我获得自定义扩展程序时,它会在列表中显示我的应用程序并通过它打开它,但我需要像/sdcard/file.ext
这样的FilePath,我只能得到{{ 1}}类型。
我希望我明白这个问题。
请帮助。
问候。
答案 0 :(得分:0)
content://
Uri不一定指向SD卡上的文件。
它更有可能指向存储在数据库中的任何类型的数据
或者通过内容提供商访问另一个应用的私有文件存储。
我认为后一种情况是邮件附件(如果内容提供商没有直接从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;
}