programacion - ¿Cómo puedo determinar si Android puede manejar PDF?
manual de programacion android pdf (3)
He estado probando esto y descubrí que lo siguiente funciona. Primero descarga el archivo de forma independiente y lo almacena en el dispositivo y luego haces 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 emuladores y un teléfono con cianógeno enraizado, 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 mime de pdf para obtener el comportamiento correcto.
Si, por ejemplo, instala droidreader, reaccionará al intento y mostrará el pdf.
Por supuesto, podría 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: Desde entonces he 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;
}
}
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?
Actualmente, el código para iniciar la descarga de PDF parece 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 al 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 PDF en Android Market.
Probablemente usará la tarea de asincronización para descargar cualquier archivo. De esta manera, simplemente agregue el código siguiente en el método post execute () de asynch task. Le pedirá que elija.
FileOpener.open(context, file);
y el archivo debe contener información sobre filepath y filename. Ejemplo
File file = new File(Environment
.getExternalStoragePublicDirectory("/MDroid")
+ filepath + fileName );
Espero eso ayude
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/