【问题标题】:Fetching attachments with custom extension in my Android application在我的 Android 应用程序中获取具有自定义扩展名的附件
【发布时间】:2013-05-10 02:05:48
【问题描述】:

我想要达到的效果听起来很熟悉,它在 Stack Overflow 中也被多次发布,但我无法完成。

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

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

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

有什么方法可以处理content:// 类型而不实际下载它。

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

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

请帮忙。

问候。

【问题讨论】:

    标签: android android-intent view intentfilter


    【解决方案1】:

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

    【讨论】:

    • 我在另一篇文章中使用了这种方法,但您的答案是正确的,对其他人也有用,因此标记为正确。但是当我尝试了上述方法时,事实证明它并不适用于所有设备。因此,将DISPLAY_NAME 更改为_display_name 就像this 中建议的那样会更好,并且可以在更多设备上使用。
    猜你喜欢
    • 2011-01-09
    • 2013-06-10
    • 2011-09-12
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多