我正在尝试在我的应用中加载电子邮件附件。我可以获取内容,但我无法获取文件名。
以下是我的意图过滤器的样子:
<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);
在这种情况下,我在哪里可以找到文件名?
答案 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 ""; }
}