0

我想要实现的目标听起来很熟悉,它在 Stack Overflow 中也被多次发布,但我无法完成。

场景是,我收到一封带有自定义扩展名的附件的邮件。我的应用程序可以识别该扩展名,它需要 FilePath 来处理它。

目前,当我在我的应用程序中获取附件时,我getIntent().getData()得到的只是表单的路径content://

我已经看到将类型的媒体内容转换content://为 FilePath 之类的方法,/sdcard/file.ext但我无法使用它转换附件。可能是显而易见的。

有什么方法可以在content://不实际下载的情况下处理类型。

目前来自 k9 邮件应用程序,当我获得自定义扩展名时,它会在列表中显示我的应用程序并通过它打开它,但我需要 FilePath 之类的/sdcard/file.ext并且我只能获取content://类型。

我希望我把问题说清楚了。

请帮忙。

问候。

4

1 回答 1

0

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; 
}
于 2013-05-16T06:11:22.093 回答