在我的Android应用程序中使用自定义扩展程序获取附件

时间:2013-05-15 13:18:08

标签: android android-intent view intentfilter

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

方案是,我收到一封附有自定义附加信息的附件的邮件。扩展程序由我的应用程序识别,它需要FilePath来处理它。

目前,当我使用getIntent().getData()在我的应用中获得附件时,我得到的是content://

形式的路径

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

有没有办法在不实际下载的情况下处理content://类型。

目前来自k9邮件应用程序,当我获得自定义扩展程序时,它会在列表中显示我的应用程序并通过它打开它,但我需要像/sdcard/file.ext这样的FilePath,我只能得到{{ 1}}类型。

我希望我明白这个问题。

请帮助。

问候。

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; 
}