2010-05-06 19 views
28

我知道Android本身無法處理PDF。但是,Nexus One(可能還有其他電話)預裝了QuickOffice Viewer。我將如何確定用戶是否安裝了PDF查看器?如何確定Android是否可以處理PDF

目前,啓動PDF下載的代碼看起來很簡單:

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

下載後,用戶點擊下載的文件來調用瀏覽器。 但是,如果沒有PDF閱讀器,Android報告「無法下載,手機上不支持該內容。」 我想確定用戶是否會收到此消息,如果有,請將其指向Android Market中的PDF應用。

+0

我的HTC Hero帶着觀衆的QuickOffice和HTC自家的PDF閱讀器預裝。 – adrianbanks 2010-05-06 22:10:38

回答

52

我一直在測試這個,發現以下工作。首先,你單獨下載該文件,並將其存儲在設備上,然後你去做到這一點:

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

那麼,您需要先下載PDF,然後嘗試顯示它? 這是否與遠程託管的PDF一起工作? – 2010-05-07 18:35:27

+0

不,你必須從我發現的東西中下載它。在意圖傳遞一個URL不適用於大量的PDF閱讀器.. – 2012-02-17 18:39:25

+0

感謝您創建它幫助了很多的方法。 – jyomin 2013-12-18 12:25:18

10

您可以查詢PackageManager以查看是否有可處理您的Intent的包。這裏是一個例子:http://www.curious-creature.org/2008/12/15/android-can-i-use-this-intent/

+4

這告訴我,即使在Android 1.5模擬器上,BrowserActivity也可以處理PDF。但是,在仿真器下載文件後,下載列表顯示「無法下載,手機上不支持該內容。」我如何確定我是否會收到此消息? – 2010-05-07 16:23:13

0

你可能會使用非同步任務下載任何file.so簡單的方式是後只需添加以下代碼execute()方法異步task.it會要求選擇。

FileOpener.open(context, file); 

和文件應包含有關文件路徑和filename.Example信息

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

希望它可以幫助