2011-01-29 10 views
6

Disculpas si esto ya ha sido respondido - si alguien me puede señalar una pregunta ya respondida, sería genial ...En Android, ¿cómo puedo mostrar un selector de aplicaciones según el tipo de archivo?

Muy simple, me gustaría poder mostrar una lista de aplicaciones que puede procesar un archivo de un tipo dado; por ejemplo, si tengo un archivo de música (mp3, ogg, lo que sea), me gustaría poder mostrar una lista de todas las aplicaciones multimedia cargadas que pueden procesar el archivo y permitir el usuario para seleccionar uno.

He estado jugando con la creación de una intención de hacer esto de la siguiente manera:

Intent myIntent = new Intent(); 
myIntent.setAction(Intent.ACTION_VIEW); 
myIntent.addCategory("android.intent.category.LAUNCHER"); 
myIntent.setType("mp3"); 
startActivity(myIntent); 

pero obviamente que he recibido es incorrecto, ya que se bloquea cada vez. ¿Debo usar ACTION_PICK o ACTION_CHOOSER en lugar de ACTION_VIEW?

Más importante aún, ¿es posible definir fácilmente todos los reproductores de medios por otro motivo que no sea Intent.type? Creo que el tipo debe ser un tipo MIME adecuado, en minúsculas, pero no estoy seguro de qué usar en este caso ...

favor ser suave :)

+0

Haciendo ping a esto para ver si alguien tiene una respuesta (incluso una respuesta parcial) ... – roryhewitt

+0

Tuve un problema similar. Usé la siguiente solución para obtener un selector de aplicaciones: http://stackoverflow.com/questions/7635764/sepplication-selection-dialog-based-on-filetype Esta solución también elimina la necesidad de crear su propio diálogo. – kaspermoerch

Respuesta

8

Para obtener las aplicaciones que pueden abrir con éxito un intento determinado, usará el PackageManager. Simplemente construya el intento como se indicó anteriormente y luego use este código para obtener las aplicaciones que pueden manejar el intento.

Intent myIntent = new Intent(); 
myIntent.setAction(Intent.ACTION_VIEW); 
myIntent.addCategory("android.intent.category.LAUNCHER"); 
myIntent.setType("mp3");  

PackageManager manager = getPackageManager(); 
List<ResolveInfo> info = manager.queryIntentActivities(
    myIntent, PackageManager.MATCH_DEFAULT_ONLY); 

Esto le dará toda la información sobre los programas que pueden manejar la intención, incluidos el icono y el nombre del paquete. A continuación, puede crear un cuadro de diálogo con estas opciones y guardar la opción que el usuario elija.

+0

Por "la intención de arriba", ¿te refieres al código de @ sstn? En este caso, ¿quiere decir usar su código de gestor de paquetes ** en su lugar ** de startActivity()? – roryhewitt

+0

derecha. Entonces eso te dará toda la información que necesitas. Déjame limpiar el código un poco. –

+0

¡Eso se ve genial! Supongo que no tiene ningún código para un cuadro de diálogo apropiado, ¿verdad? ¿O simplemente creo mi propio "estándar"? – roryhewitt

1

Asumo que quiere ver este selector diálogo si abre un archivo (o URL) y hay más de una aplicación registrada para manejarlo? P.ej. ¿abres una URL de youtube y puedes elegir usar el reproductor o el navegador de youtube?

Ese es el tipo de intención el sistema envía cuando quiero abrir una imagen (a través del navegador de archivos):

File f = new File("/sdcard/IMG_0114.JPG"); 
Uri uri = Uri.fromFile(f); 

Intent i = new Intent(Intent.ACTION_VIEW); 
// use setDataAndType() - setData() and setType() cancel each other 
i.setDataAndType(uri, "image/jpeg"); 
i.putExtra("preview", false); 
i.putExtra("key_filename", "/sdcard/IMG_0114.JPG"); 
i.putExtra(Intent.EXTRA_STREAM, uri); 
i.putExtra("sort_order", 0); 

// It's one of the flag combinations: 
i.setFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); 

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
     Intent.FLAG_ACTIVITY_SINGLE_TOP | 
     Intent.FLAG_ACTIVITY_MULTIPLE_TASK | 
     Intent.FLAG_DEBUG_LOG_RESOLUTION); 

startActivity(i); 

EDIT: código para obtener una solución de trabajo (mínimo) corregido.

No estoy seguro de qué campos de los datos adicionales deben establecerse, no encontré documentación para eso.

+0

tiene la razón de que quiero ver el cuadro de diálogo del selector. Sin embargo, en realidad no quiero abrir el archivo (de hecho, en realidad no voy a tener un archivo específico). Deseo poder devolver el método que se usaría para abrir ese archivo. – roryhewitt

+0

Básicamente, quiero mostrar un selector para un ** tipo ** de archivo y luego poder guardar (en mi aplicación) el nombre de la aplicación elegida. ¿Tiene sentido? – roryhewitt

Cuestiones relacionadas