Как я определяю, может ли Android обработать PDF

Я знаю, что Android не может обработать PDFs исходно. Однако Nexus One (и возможно другие телефоны) прибывает предварительно установленный со Средством просмотра Quickoffice. Как я определил бы, установили ли пользователю средство просмотра PDF?

В настоящее время код для запуска загрузки PDF выглядит довольно простым:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);

После загрузки пользователь нажимает на загруженный файл для вызова средства просмотра. Однако, если нет никакого средства просмотра PDF, отчеты Android "Не могут загрузить. Содержание не поддерживается по телефону". Я хочу определить, получит ли пользователь это сообщение, и если так, направьте их к приложениям PDF в Android Market.

29
задан Janusz 11 October 2010 в 11:35
поделиться

2 ответа

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

 File file = new File("/sdcard/download/somepdf.pdf");

 PackageManager packageManager = getPackageManager();
 Intent testIntent = new Intent(Intent.ACTION_VIEW);
 testIntent.setType("application/pdf");
 List list = packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY);
 if (list.size() > 0 && file.isFile()) {
     Intent intent = new Intent();
     intent.setAction(Intent.ACTION_VIEW);
     Uri uri = Uri.fromFile(file);
     intent.setDataAndType(uri, "application/pdf");

     startActivity(intent);

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

Похоже, что для правильного поведения важно установить тип данных на тип мима pdf.

Если вы, например, установите droidreader, он отреагирует на намерение и отобразит pdf.

Конечно, вы можете сделать проверку и до загрузки pdf, в зависимости от вашего сценария использования, или сделать что-то вроде всплывающих предупреждений или перенаправления на другие намерения для загрузки или что-то еще.

Edit: I have since refactored this out into a separate method ...

    public static final String MIME_TYPE_PDF = "application/pdf";

/**
 * Check if the supplied context can render PDF files via some installed application that reacts to a intent
 * with the pdf mime type and viewing action.
 *
 * @param context
 * @return
 */
public static boolean canDisplayPdf(Context context) {
    PackageManager packageManager = context.getPackageManager();
    Intent testIntent = new Intent(Intent.ACTION_VIEW);
    testIntent.setType(MIME_TYPE_PDF);
    if (packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0) {
        return true;
    } else {
        return false;
    }
}
56
ответ дан 28 November 2019 в 01:13
поделиться

Вы можете запросить PackageManager, чтобы узнать, есть ли пакет, который может обработать ваше намерение. Вот пример: http://www.curious-creature.org/2008/12/15/android-can-i-use-this-intent/

10
ответ дан 28 November 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: