Android - 在我的应用程序中获取电子邮件附件名称

时间:2011-05-17 18:38:36

标签: android android-intent android-contentprovider

我正在尝试在我的应用中加载电子邮件附件。我可以获取内容,但我无法获取文件名。

以下是我的意图过滤器的样子:

        <intent-filter>
            <action
                android:name="android.intent.action.VIEW" />
            <category
                android:name="android.intent.category.DEFAULT" />
            <data
                android:mimeType="image/jpeg" />
        </intent-filter>

这是我得到的:

  

INFO / ActivityManager(97):开始:   意图{   ACT = android.intent.action.VIEW   DAT =含量://gmail-ls/messages/john.doe%40gmail.com/42/attachments/0.1/SIMPLE/false   typ = image / jpeg flg = 0x3880001   CMP = com.myapp / .ui.email.EmailDocumentActivityJpeg   来自pid 97

在我的活动中,我获取了Uri并使用它来获取文件内容的输入流:

InputStream is = context.getContentResolver().openInputStream(uri);

在这种情况下,我在哪里可以找到文件名?

4 个答案:

答案 0 :(得分:8)

我今天遇到了同样的问题,最后在另一篇文章中找到了解决方案:Android get attached filename from gmail app 主要思想是,您获得的URI既可用于检索文件内容,也可用于查询以获取更多信息。 我做了一个快速实用程序函数来检索名称:

public static String getContentName(ContentResolver resolver, Uri uri){
    Cursor cursor = resolver.query(uri, null, null, null, null);
    cursor.moveToFirst();
    int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
    if (nameIndex >= 0) {
        return cursor.getString(nameIndex);
    } else {
        return null;
    }
}

您可以在活动中使用这种方式:

Uri uri = getIntent().getData();
String name = getContentName(getContentResolver(), uri);

这对我有用(检索PDF文件的名称)。

答案 1 :(得分:4)

常量MediaStore.MediaColumns.DISPLAY_NAME解析为字符串"_display_name"。使用此字符串输入的数组用于选择要通过查询获得的列。对于此参数,null的行为可能因各种手机而异?通过HTC手机返回所有列(因为它应该根据javadoc)而对其他人没有? javadoc声明您应该出于性能原因检索特定列。通过在null参数上不返回任何内容,制造商可能希望强制执行此性能“优化”。

因此,这适用于所有手机:

public static String getContentName (ContentResolver resolver, Uri uri) {
    Cursor cursor = resolver.query(uri, 
       new String[]{MediaStore.MediaColumns.DISPLAY_NAME}, null, null, null);
    cursor.moveToFirst();
    int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
    if (nameIndex >= 0) {
        return cursor.getString(nameIndex);
    }

    return null;    
}

我无法测试这个,因为我只有HTC手机:)。

答案 2 :(得分:3)

谢谢大家,我解决了这个问题。但我想指出上面的错误。我想你测试的手机是HTC。我使用上面的代码在我的HTC手机上正确运行,但是当我在联想手机或M9(来自中国的手机)上运行时,我无法获得电子邮件文件的名称。当id调试代码时,变量“nameIndex”返回“-1”而不是正确的数字“0”,所以我无法获取电子邮件文件的名称。寻找一个下午,终于解决了问题。

public static String getEmailFileName(ContentResolver resolver, Uri uri){
Cursor cursor = resolver.query(uri, new String[]{"_display_name"}, null, null, null);
cursor.moveToFirst();
int nameIndex = cursor.getColumnIndex("_display_name");
if (nameIndex >= 0) {
    return cursor.getString(nameIndex);
} else {
    return null;
}

}

答案 3 :(得分:2)

这是一个&#34;组合解决方案&#34;。请注意使用mimeType的最终回退。您需要定义toExtension()方法...

private static String contentUriFilename( Uri uri ){
    String fileName="";
    if( fileName.isEmpty() )
        fileName = contentUriFilename( uri, android.provider.OpenableColumns.DISPLAY_NAME );
    if( fileName.isEmpty() )
        fileName = contentUriFilename( uri, android.provider.MediaStore.MediaColumns.DISPLAY_NAME );
    if( fileName.isEmpty() )
        fileName = contentUriFilename( uri, "_display_name" );
    if( fileName.isEmpty() ){
        String mimeType;
        try{ mimeType = context_.getContentResolver().getType( uri ); }
        catch( Exception e ){ mimeType=""; }
        fileName = "unknown." + toExtension( mimeType );
    }
    return fileName;
}

private static String contentUriFilename( Uri uri, String columnName ){
    Cursor cursor = context_.getContentResolver().query( uri,
        new String[]{columnName}, null, null, null);
    cursor.moveToFirst();
    try{
        return cursor.getString(
                    cursor.getColumnIndexOrThrow( columnName ) );
    }
    catch( Exception e ){ return ""; }
}