Я знаю, что 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.
Я тестировал это и обнаружил, что работает следующее. Сначала вы скачиваете файл самостоятельно и сохраняете его на устройстве, а затем делаете следующее:
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;
}
}
Вы можете запросить PackageManager, чтобы узнать, есть ли пакет, который может обработать ваше намерение. Вот пример: http://www.curious-creature.org/2008/12/15/android-can-i-use-this-intent/