Как определить, может ли Android обрабатывать PDF? - PullRequest
29 голосов
/ 07 мая 2010

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

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

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

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

Ответы [ 3 ]

56 голосов
/ 07 мая 2010

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

 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);

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

Кажется важным установить тип данных в pime mime, чтобы получить правильное поведение.

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

Конечно, вы можете выполнить проверку перед загрузкой PDF-файла, в зависимости от вашего варианта использования, или сделать такие действия, как появление предупреждений или перенаправление, сделать другие намерения для загрузки или что-то подобное.

Редактировать: с тех пор я изменил это в отдельный метод ..

    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;
    }
}
10 голосов
/ 07 мая 2010

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

0 голосов
/ 03 ноября 2016

Вы, вероятно, будете использовать асинхронную задачу для загрузки любого файла. Простой способ - просто добавить приведенный ниже код в метод post execute () асинхронной задачи.

FileOpener.open(context, file);

и файл должен содержать информацию о пути к файлу и имени файла. Пример

File file = new File(Environment
        .getExternalStoragePublicDirectory("/MDroid")
        + filepath + fileName );

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...