2010-05-06 21 views
28

Tôi biết Android không thể xử lý tệp PDF nguyên bản. Tuy nhiên, Nexus One (và các điện thoại khác có thể) được cài sẵn với Trình xem QuickOffice. Làm cách nào để xác định liệu người dùng có cài đặt trình xem PDF không?Làm cách nào để xác định xem Android có thể xử lý PDF

Hiện nay, các mã để bắt đầu tải về PDF trông khá đơn giản:

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

Sau khi tải về, người dùng nhấp chuột vào file đã download để gọi người xem. Tuy nhiên, nếu không có trình xem PDF, báo cáo Android "Không thể tải xuống. Nội dung không được hỗ trợ trên điện thoại". Tôi muốn xác định xem người dùng có nhận được thông báo này không và nếu có, hãy chuyển họ đến ứng dụng PDF trong Android Market.

+0

HTC My Hero đã được cài đặt sẵn với người xem QuickOffice và xem PDF riêng của HTC. – adrianbanks

Trả lời

52

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; 
    } 
} 
+1

Vì vậy, bạn cần tải xuống tệp PDF trước, sau đó thử hiển thị nó? Điều này có hoạt động với các tệp PDF được lưu trữ từ xa không? –

+0

Không .. bạn phải tải xuống từ những gì tôi tìm thấy. Việc chuyển url trong mục đích không hoạt động với nhiều trình đọc PDF .. –

+0

cảm ơn bạn đã tạo phương thức mà nó đã giúp rất nhiều. – jyomin

10

Bạn có thể truy vấn PackageManager để xem liệu có gói nào có thể xử lý Intent của bạn hay không. Dưới đây là ví dụ: http://www.curious-creature.org/2008/12/15/android-can-i-use-this-intent/

+4

Điều này cho tôi biết rằng BrowserActivity có thể xử lý tệp PDF, ngay cả trên Trình giả lập Android 1.5. Tuy nhiên, sau khi trình mô phỏng đó tải xuống tệp, danh sách tải xuống hiển thị "Không thể tải xuống. Nội dung không được hỗ trợ trên điện thoại". Làm thế nào tôi có thể xác định xem tôi sẽ nhận được thông báo này? –

0

Bạn có thể sẽ sử dụng asynch nhiệm vụ để tải về bất kỳ cách file.so đơn giản là Chỉ cần thêm bên dưới mã trong bài thi() phương pháp của asynch task.it sẽ yêu cầu lựa chọn.

FileOpener.open(context, file); 

và tập tin nên chứa thông tin về filepath và filename.Example

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

Hy vọng nó giúp

Các vấn đề liên quan