2010-05-06 14 views
28

Sé que Android no puede manejar archivos PDF de forma nativa. Sin embargo, el Nexus One (y posiblemente otros teléfonos) viene preinstalado con QuickOffice Viewer. ¿Cómo puedo determinar si el usuario tiene instalado un visor de PDF?¿Cómo puedo determinar si Android puede manejar PDF

Actualmente, el código para iniciar la descarga en PDF se ve bastante simple:

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

Después de la descarga, el usuario hace clic en el archivo descargado para invocar el espectador. Sin embargo, si no hay un visor de PDF, Android informa "No se puede descargar. El contenido no es compatible con el teléfono". Quiero determinar si el usuario recibirá este mensaje y, de ser así, dirigirlos a las aplicaciones de PDF en Android Market.

+0

Mi HTC Hero vino preinstalado con QuickOffice espectador y el propio visor de PDF de HTC. – adrianbanks

Respuesta

52

He estado probando esto y he encontrado que lo siguiente funciona. En primer lugar de descargar el archivo de forma independiente y lo almacena en el dispositivo y luego vas hacer esto:

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

He probado esto en varios emulador y un teléfono de cianógeno arraigada, así como un HTC Magic. Si no hay un procesador de PDF disponible, la lista devolverá cero y no pasará nada.

Parece importante establecer el tipo de datos en el tipo mimo de pdf para obtener el comportamiento correcto.

Si, por ejemplo, instalar droidreader reaccionará a la intención y mostrará el pdf.

Por supuesto, usted puede hacer el control antes de descargar el pdf, dependiendo de su caso de uso, o hacer cosas como mostrar alertas o redirigir otros intentos de descarga o lo que sea.

Editar: Tengo desde refactorizado esto en un método separado ..

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

Entonces, primero debe descargar el PDF y luego intentar mostrarlo? ¿Funcionará esto con archivos PDF alojados de forma remota? –

+0

No .. tienes que descargarlo de lo que encontré. Pasar una url en el intento no funciona con muchos lectores de PDF. –

+0

gracias por crear el método que ayudó mucho. – jyomin

10

Puede consultar el PackageManager para ver si hay un paquete que pueda manejar su intención. Aquí hay un ejemplo: http://www.curious-creature.org/2008/12/15/android-can-i-use-this-intent/

+4

Esto me dice que BrowserActivity puede manejar el PDF, incluso en el emulador de Android 1.5. Sin embargo, después de que el emulador descargue el archivo, la lista de descargas muestra "No se puede descargar. El contenido no es compatible con el teléfono". ¿Cómo puedo determinar si recibiré este mensaje? –

0

Probablemente utilice asynch tarea de descargar cualquier manera sencilla se file.so Sólo tiene que añadir a continuación el código en el post método execute() de asynch task.it pedirá elección.

FileOpener.open(context, file); 

y el archivo debe contener información sobre ruta de archivo y filename.Example

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

creo que sirve

Cuestiones relacionadas