2010-05-06 9 views
28

Ich weiß, dass Android native PDFs nicht verarbeiten kann. Das Nexus One (und möglicherweise andere Telefone) sind jedoch bereits mit QuickOffice Viewer vorinstalliert. Wie würde ich feststellen, ob der Benutzer einen PDF-Viewer installiert hat?Wie stelle ich fest, ob Android mit PDF umgehen kann

Derzeit ist der Code, der die PDF-Download zu starten sieht ziemlich einfach:

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

Nach dem Download der Benutzer klickt auf die heruntergeladene Datei, um den Betrachter aufzurufen. Wenn jedoch kein PDF-Viewer verfügbar ist, meldet Android "Kann nicht heruntergeladen werden. Der Inhalt wird auf dem Telefon nicht unterstützt." Ich möchte feststellen, ob der Benutzer diese Nachricht erhält, und wenn ja, leiten Sie sie zu PDF-Anwendungen im Android Market.

+0

Mein HTC Hero kam vorinstalliert mit Quickoffice Viewer und HTC eigenen PDF-Viewer hilft. – adrianbanks

Antwort

52

Ich habe dies getestet und festgestellt, dass das folgende funktioniert. Zuerst laden Sie die Datei unabhängig und speichern Sie es auf dem Gerät und dann gehen Sie wie folgt vorgehen:

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); 

ich dies auf verschiedenen Emulator und einem verwurzelten Cyanogen Telefon sowie ein HTC Magic getestet haben. Wenn kein PDF-Renderer verfügbar ist, gibt die Liste null zurück und nichts wird passieren.

Es scheint wichtig zu sein, den Datentyp auf den PDF-Mime-Typ einzustellen, um das richtige Verhalten zu erhalten.

Wenn Sie z.B. install droidreader es wird auf die Absicht reagieren und die pdf anzeigen.

Natürlich können Sie die Überprüfung auch vor dem Download der PDF-Datei je nach Anwendungsfall tun oder Dinge wie Popup-Warnungen oder Weiterleiten andere Absichten zum Download oder was auch immer tun.

Edit: Ich habe dies seit dem in einem separaten Verfahren Refactoring out ..

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

Sie müssen also zuerst die PDF herunterladen und dann versuchen, sie anzuzeigen? Funktioniert das mit remote gehosteten PDFs? –

+0

Nein .. Sie müssen es herunterladen, was ich gefunden habe. Das Übergeben einer URL in der Absicht funktioniert nicht mit vielen PDF-Lesern. –

+0

danke für die Erstellung der Methode, die es sehr geholfen hat. – jyomin

10

Sie können den PackageManager abfragen, um zu sehen, ob es ein Paket gibt, das Ihre Absicht verarbeiten kann. Hier ist ein Beispiel: http://www.curious-creature.org/2008/12/15/android-can-i-use-this-intent/

+4

Das sagt mir, dass die BrowserActivity die PDF verarbeiten kann, sogar auf dem Android 1.5 Emulator. Nachdem der Emulator die Datei heruntergeladen hat, wird in der Downloadliste jedoch "Kann nicht herunterladen angezeigt. Der Inhalt wird auf dem Telefon nicht unterstützt." Wie kann ich feststellen, ob ich diese Nachricht bekomme? –

0

Sie werden wahrscheinlich Code unten in der Post execute() -Methode verwenden asynch Aufgabe Fügen Sie einfach jede file.so einfache Möglichkeit zum Download von asynch task.it wird nach einer Auswahl fragen.

FileOpener.open(context, file); 

und Datei sollte Informationen über filepath und filename.Example enthalten

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

Hope it

Verwandte Themen