Получение вложений с пользовательским расширением в моем приложении для Android

То, чего я пытаюсь добиться, звучит очень знакомо, это много раз публиковалось здесь и там в Stack Overflow, но я не могу это сделать.

Сценарий таков: я получаю письмо с вложением, имеющим пользовательское расширение. Расширение распознается моим приложением, и для его обработки требуется FilePath.

В настоящее время, когда я получаю вложение в своем приложении, используя getIntent().getData(), все, что я получаю, это путь формы content://

Я видел методы для преобразования медиаконтента типа content:// в FilePath, например /sdcard/file.ext, но мне не удалось преобразовать вложение с его помощью. Может быть, это очевидно.

Есть ли способ, которым я могу обработать тип content://, фактически не загружая его.

В настоящее время из почтового приложения k9, когда я получаю пользовательское расширение, оно показывает мое приложение в списке и открывает его через него, но мне нужен FilePath, например /sdcard/file.ext, и я могу получить только тип content://.

Надеюсь, я ясно изложил вопрос.

Пожалуйста помоги.

С Уважением.


person openrijal    schedule 15.05.2013    source источник


Ответы (1)


content:// Uri не обязательно указывает на файл на SD-карте. Скорее всего, он указывает на какие-либо данные, хранящиеся в базе данных, или на поставщика контента, который предоставляет вам доступ к частному хранилищу файлов другого приложения.

Я думаю, что последний случай относится к почтовым вложениям (если поставщик контента не запрашивает его напрямую с веб-сервера). Таким образом, преобразование 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; 
}
person Stenes    schedule 16.05.2013
comment
Я использовал этот метод из другого поста, но ваш ответ правильный, он полезен и другим, поэтому пометил его правильно. Но как я пробовал вышеописанный способ, оказывается он работает не в каждом устройстве. Следовательно, изменение DISPLAY_NAME на _display_name, как предлагается в это, было бы лучше и будет работать на большем количестве устройств. - person openrijal; 16.05.2013