2011-02-10 13 views
8

Primero, disculpe si esto se ha preguntado pero no puedo encontrarlo. Estoy descargando documentos en mi aplicación desde un recurso remoto. Una vez que se descarga el documento, quiero abrirlo para el usuario. Lo que quiero saber es cómo puedo verificar si tienen una aplicación para manejar Pdf o Tiff y lanzarla en la aplicación predeterminada para ellos.Android: abra el archivo guardado en la aplicación predeterminada de mi aplicación

Gracias.

edición

aquí es parte de la solución:

Intent viewDoc = new Intent(Intent.ACTION_VIEW); 
viewDoc.setDataAndType(
    Uri.fromFile(getFileStreamPath("test.pdf")), 
    "application/pdf"); 

PackageManager pm = getPackageManager(); 
List<ResolveInfo> apps = 
    pm.queryIntentActivities(viewDoc, PackageManager.MATCH_DEFAULT_ONLY); 

if (apps.size() > 0) 
    startActivity(viewDoc); 

Respuesta

7

Paso # 1: Crear una ACTION_VIEWIntent, utilizando setDataAndType() para proporcionar una Uri a su archivo descargado (por ejemplo, Uri.fromFile()) y el tipo MIME del contenido (p. ej., application/pdf).

A partir de ahí, usted tiene dos opciones:

Paso 2a: Use PackageManager y queryIntentActivities() con que Intent. Si devuelve una lista de longitud cero, usted sabe que no hay candidatos y, por lo tanto, puede deshabilitar cualquier botón, opción de menú o lo que sea que lleve a llamar al startActivity() en ese Intent.

o

Paso 2b: Sólo tiene que llamar startActivity() cuando el usuario quiere ver, y detectar la excepción que se produce cuando no hay aplicaciones compatibles instaladas. Esto es más simple que el # 2a anterior, pero no tan fácil de usar.

+0

Si tengo un byte [] del archivo, este método seguirá funcionando si no quiero sa ¿Lo tienes en el disco? –

+0

@Tom Fobear: No tiene más remedio que guardarlo en el disco, en un lugar que pueda leer la otra aplicación. Eso significa almacenarlo en un almacenamiento externo, o almacenarlo como un archivo 'MODE_WORLD_READABLE' en su tienda de archivos local de la aplicación, o almacenarlo como un archivo normal (denegar todo) en la tienda de archivos local de la aplicación y usar un proveedor de contenido para que esté disponible para otras aplicaciones. – CommonsWare

+0

Se produjo un problema. En mi dispositivo, había varias aplicaciones que afirmaban que eran compatibles con mi intención al usar el método PackageManager. Descubrí que los archivos se estaban guardando correctamente. Por ejemplo, una vez que descargué adobe reader pude ver los pdfs que inicié desde mi actividad. ¿Existe un método más legítimo para buscar buenas aplicaciones además de las opciones de hardcoding en? Gracias. –

1

El siguiente código que podría ayudar

código

para el archivo
escribir el código para obtener la url del archivo en función principal

File myFile = new File("your any type of file url"); 
FileOpen.openFile(mContext, myFile); 

código para abrir la aplicación por defecto presente en el auricular crear otra clase

public class FileOpen { 
    public static void openFile(Context context, File url) throws IOException { 
     // Create URI 
     File file=url; 
     Uri uri = Uri.fromFile(file); 

     Intent intent = new Intent(Intent.ACTION_VIEW); 
     // Check what kind of file you are trying to open, by comparing the url with extensions. 
     // When the if condition is matched, plugin sets the correct intent (mime) type, 
     // so Android knew what application to use to open the file 
     if (url.toString().contains(".doc") || url.toString().contains(".docx")) { 
      // Word document 
      intent.setDataAndType(uri, "application/msword"); 
     } else if(url.toString().contains(".pdf")) { 
      // PDF file 
      intent.setDataAndType(uri, "application/pdf"); 
     } else if(url.toString().contains(".ppt") || url.toString().contains(".pptx")) { 
      // Powerpoint file 
      intent.setDataAndType(uri, "application/vnd.ms-powerpoint"); 
     } else if(url.toString().contains(".xls") || url.toString().contains(".xlsx")) { 
      // Excel file 
      intent.setDataAndType(uri, "application/vnd.ms-excel"); 
     } else if(url.toString().contains(".zip") || url.toString().contains(".rar")) { 
      // WAV audio file 
      intent.setDataAndType(uri, "application/x-wav"); 
     } else if(url.toString().contains(".rtf")) { 
      // RTF file 
      intent.setDataAndType(uri, "application/rtf"); 
     } else if(url.toString().contains(".wav") || url.toString().contains(".mp3")) { 
      // WAV audio file 
      intent.setDataAndType(uri, "audio/x-wav"); 
     } else if(url.toString().contains(".gif")) { 
      // GIF file 
      intent.setDataAndType(uri, "image/gif"); 
     } else if(url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) { 
      // JPG file 
      intent.setDataAndType(uri, "image/jpeg"); 
     } else if(url.toString().contains(".txt")) { 
      // Text file 
      intent.setDataAndType(uri, "text/plain"); 
     } else if(url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) { 
      // Video files 
      intent.setDataAndType(uri, "video/*"); 
     } else { 
      //if you want you can also define the intent type for any other file 

      //additionally use else clause below, to manage other unknown extensions 
      //in this case, Android will show all applications installed on the device 
      //so you can choose which application to use 
      intent.setDataAndType(uri, "*/*"); 
     } 

     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intent); 
    } 
} 
also u can write this if condition 
*** if(url.getPath().endsWith(".jpg") || url.getPath().endsWith(".jpeg")|| url.getPath().endsWith(".png")*** 
{ 
      intent.setDataAndType(uri,"image/*"); 
}* 
+0

Plz, avíseme si funcionó o no ... Gracias –

Cuestiones relacionadas