Android - получить имя вложения электронной почты в моем приложении - PullRequest
7 голосов
/ 17 мая 2011

Я пытаюсь загрузить приложение электронной почты в моем приложении. Я могу получить содержимое, но не могу получить имя файла.

Вот как выглядит мой фильтр намерений:

        <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): запуск: Намерение { действовать = 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 } из пид 97

В своей деятельности я получаю Uri и использую его для получения входного потока для содержимого файла:

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

Где я могу найти имя файла в этом сценарии?

Ответы [ 4 ]

8 голосов
/ 16 июня 2011

У меня была та же проблема, которую нужно решить сегодня, и в итоге я нашел решение в другом посте: Android получает прикрепленное имя файла из приложения gmail Основная идея заключается в том, что полученный вами 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-файлов).

4 голосов
/ 22 февраля 2012

Константа MediaStore.MediaColumns.DISPLAY_NAME разрешается в строку "_display_name". Массив, который вы вводите в эту строку, используется для выбора столбцов, которые вы хотите получить с помощью запроса. Поведение null для этого параметра может отличаться для разных телефонов? Вернуть все колонки (как это должно быть в соответствии с javadoc) телефонами HTC и ни один для других? 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:).

3 голосов
/ 23 декабря 2011

Спасибо всем, я решил проблему.Но я хочу указать на ошибку выше.Я предполагаю, что тестируемый вами мобильный телефон - HTC.Я использую приведенный выше код для правильного запуска на своем мобильном телефоне HTC, но когда я запускаю его на мобильном телефоне Lenovo или 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;
}

}

2 голосов
/ 16 октября 2014

Вот «комбинированное решение».Обратите внимание на последний запасной вариант, используя 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 ""; }
}
...