Подтвердить что ты не робот

Как определить, поддерживает ли Android PDF?

Я знаю, что 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.

4b9b3361

Ответ 1

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

 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 не доступен, список будет возвращать ноль, и ничего не произойдет.

Кажется, важно установить тип данных в тип PDF 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;
    }
}

Ответ 3

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

FileOpener.open(context, file);

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

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

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