Я проверял это и обнаружил, что работает следующее. Сначала вы загружаете файл самостоятельно и сохраняете его на устройстве, а затем делаете следующее:
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;
}
}