Tôi đã thử nghiệm điều này và thấy rằng các công trình sau đây. Trước tiên, bạn tải về các tập tin một cách độc lập và lưu trữ nó trên thiết bị và sau đó bạn đi làm điều này:
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);
Tôi đã thử nghiệm này trên giả lập khác nhau và một chiếc điện thoại cyanogen bắt rễ cũng như HTC Magic. Nếu không có trình kết xuất pdf nào có sẵn thì danh sách sẽ trả về 0 và không có gì xảy ra.
Có vẻ như điều quan trọng là đặt loại dữ liệu thành loại mime pdf để có được hành vi đúng.
Nếu bạn, ví dụ: cài đặt droidreader nó sẽ phản ứng với mục đích và hiển thị pdf.
Tất nhiên bạn có thể thực hiện kiểm tra trước khi bạn tải xuống pdf tùy theo trường hợp sử dụng của bạn hoặc làm những việc như cảnh báo hoặc chuyển hướng thực hiện các mục đích khác để tải xuống hoặc bất kỳ điều gì.
Edit: Tôi có kể từ khi refactored này ra thành một phương pháp riêng biệt ..
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;
}
}
Nguồn
2010-05-07 17:21:51
HTC My Hero đã được cài đặt sẵn với người xem QuickOffice và xem PDF riêng của HTC. – adrianbanks