2011-01-03 19 views
5

En mi aplicación, tengo un elemento de menú que me permite abrir el reproductor multimedia preferido del usuario, solo me interesa el audio. Idealmente, la primera vez que el usuario elija este elemento, elegiría el único reproductor multimedia en el teléfono si solo tiene uno instalado, o les presentará una lista si tienen más de uno. Entonces salvaría su elección así que la próxima vez abriría esa.Cómo obtener una lista de reproductores multimedia instalados

Según tengo entendido, Android no tiene un reproductor multimedia predeterminado. Tengo el Droid original y tiene un reproductor multimedia, pero entiendo que otros operadores usen el suyo propio, o el usuario puede desinstalar el estándar.

He intentado algunas cosas pero no puedo hacer que nada funcione.

Intenté este código, que se supone que debe obtener una lista de paquetes que admiten la intención. Funciona para algunas cosas como "aplicación/pdf" y "video/*". Cuando lo intento con "audio/*" obtengo una lista vacía, aunque tengo instalados tanto el reproductor multimedia original de Android como MixZing. También lo intenté con "media/*" y no obtuve nada.

PackageManager packageManager = getPackageManager(); 
Intent testIntent = new Intent(Intent.ACTION_VIEW); 
testIntent.setType("audio/*"); 
List list = packageManager.queryIntentActivities(testIntent, 0); 

he visto este código que funciona y se abre un archivo de audio con el reproductor por defecto, sin embargo no quiero abrir un archivo, sólo quiero abrir la aplicación de audio como si el usuario lo abrió desde el cajón de la aplicación.

Intent i = new Intent(Intent.ACTION_VIEW); 
Uri u = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,"1"); 
i.setData(u); 
startActivity(i); 

La única otra cosa que puedo pensar que hacer es salir y conseguir los nombres de los paquetes de la reproductores multimedia y codificar los más populares y buscar en el teléfono para ver qué se instalan queridos, pero este doesn' Parece el mejor enfoque. No entiendo por qué el primer bit de código no funciona. Tal vez los filtros de intención no están configurados correctamente para esas aplicaciones o estoy usando el código incorrecto o los tipos de mime.

+0

El segundo bit de código hace exactamente lo que quiere sobre el lanzamiento de la actividad. Me presenta una lista de aplicaciones en mi teléfono que puede manejar la intención. Simplemente no puedo encontrar una manera de generar esa lista yo solo para poder manipular las cosas. No quiero comenzar la actividad, solo obtengo los datos que usa el sistema operativo para generar esa lista. – Bob

+0

Bien, creo que tengo esto funcionando. Publicaré la solución cuando lo obtenga. – Bob

+0

Esto también podría funcionar para usted: http://stackoverflow.com/questions/18161237/list-installed-media-players-android/21658150#21658150 – yado

Respuesta

6

Bien, aquí es cómo le pido al sistema operativo una lista de reproductores de audio instalados.

Intent intent = new Intent(Intent.ACTION_VIEW); 
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,"1"); 
intent.setData(uri); 
List<ResolveInfo> playerList; 
playerList = packageManager.queryIntentActivities(intent, 0); 

playerList A continuación, se rellenará con objetos ResolveInfo para cada aplicación en el teléfono que pretende manejar audio. Desde ResolveInfo puede obtener cosas como el nombre del paquete para iniciar la actividad, puede obtener iconos y nombres de aplicaciones. Lo uso para llenar un cuadro de diálogo personalizado que se ve y actúa como el cuadro de diálogo de Android para elegir una actividad para iniciar. También tengo la opción de que el usuario configure la aplicación elegida como predeterminada.

Esto no es perfecto. Usted está a merced del sistema operativo y de los filtros de la aplicación intent. Lo he intentado con unos pocos teléfonos y las siguientes aplicaciones se muestran correctamente: reproductor multimedia original para Droid original, reproductor multimedia original para teléfonos HTC, doubleTwist y MixZing. Sin embargo, instalé Zimly y no aparece. Sospecho que sus filtros de intención no están configurados para audio.

También me preocupaba que haya casos en que MediaStore.Audio.Media.INTERNAL_CONTENT_URI no tenga audio. Intenté este código inmediatamente después de reiniciar y funciona. No lo he probado en un teléfono sin medios de usuario instalados.

+0

He intentado con el código ur, está recibiendo reproductor multimedia, ¿hay algún código? para acceder a la lista de archivos de audio y vedio almacenados en el dispositivo. –

+0

Hola Bob, ¿cómo muestras la lista de aplicaciones? gracias – Ivan

+0

@Bob: esto me da 'W/ContentResolver: no se pudo obtener el tipo para: content: // media/external/audio/media/1 (URL desconocida: contenido: // media/externo/audio/media/1) 'error al ejecutar ... ¿Se necesita algún permiso para agregar AndroidManifest.xml? – Kushal

2
Intent resolveIntent = new Intent(Intent.ACTION_VIEW); 
if (type.startsWith("audio/*")) { 
    Uri uri = Uri.withAppendedPath(
      MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1"); 
    resolveIntent.setDataAndType(uri, type); 
} else if (type.startsWith("video/*")) { 
    Uri uri = Uri.withAppendedPath(
      MediaStore.Video.Media.INTERNAL_CONTENT_URI, "1"); 
    resolveIntent.setDataAndType(uri, type); 
} else if (type.startsWith("application/pdf")) { 
    resolveIntent.setType(type); 
} 

List<ResolveInfo> pkgAppsList = mContext.getPackageManager().queryIntentActivities(resolveIntent, PackageManager.GET_RESOLVED_FILTER); 

Aquí está mi solución, Si desea obtener una lista de "/ vídeo" o "/" aplicaciones audio, debe utilizar "setDataAndType"; Pero si desea obtener una lista de las aplicaciones "text/*" o "pdf", puede usar "setType".

0
Intent resolveIntent = new Intent(Intent.ACTION_VIEW); 
resolveIntent.setDataAndType(Uri.parse("file://"), MIMEType); 
List<ResolveInfo> pkgAppsList = mContext.getPackageManager().queryIntentActivities(resolveIntent, PackageManager.MATCH_DEFAULT_ONLY| PackageManager.GET_RESOLVED_FILTER); 

Creo que esto es mejor!

+1

sería una buena idea decir por qué cree que esto es mejor. – Dreamwalker

0

Para mi Samsung Galaxy S4 con Android versión 5.0, ninguna de las soluciones anteriores funcionó, pero encontré otra solución. Funciona perfectamente. Aquí está el código para alguien que pueda necesitar ayuda.

Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setDataAndType(Uri.fromFile(new File("content://media/internal/audio/media")), "audio/*"); 
    List<ResolveInfo> activities = this.getPackageManager().queryIntentActivities(intent, 0); 
    // content://media/internal/audio/media 
    //List<ResolveInfo> activities; 
    activities = getPackageManager().queryIntentActivities(intent, 0); 
    int count = activities.size(); 
    String a = Integer.toString(count); 

    //set alert for executing the task 
    AlertDialog.Builder builder1 = new AlertDialog.Builder(this); 
    builder1.setMessage("Handle: " + a); 
    builder1.setCancelable(true); 

    AlertDialog alert11 = builder1.create(); 
    alert11.show(); 
3

/* Por mi Samsung Galaxy S4 con Android versión 5.0, ninguna de las soluciones anteriores trabajos pero he encontrado otra solución. Funciona perfectamente. Aquí está el código para alguien que pueda necesitar ayuda. */

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(new File("content://media/internal/audio/media")), "audio/*"); 
List activities = this.getPackageManager().queryIntentActivities(intent, 0); 
List activities; activities = getPackageManager().queryIntentActivities(intent, 0); int count = activities.size(); String a = Integer.toString(count); 

//set alert for executing the task 
AlertDialog.Builder builder1 = new AlertDialog.Builder(this); 
builder1.setMessage("Handle: " + a); 
builder1.setCancelable(true); 

AlertDialog alert11 = builder1.create(); 
alert11.show(); 
+1

¡Esta es la única solución que también funciona para mí en los teléfonos más nuevos! – pivu0

0
/** 
    * get apps supporting video playing 
    * @return 
    */ 
    private List<String> queryPlayerPackageNameLst() 
    {   
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(Uri.parse(video), "video/*"); 

     PackageManager pm = getPackageManager(); 

     List<ResolveInfo> infos = pm.queryIntentActivities(intent,PackageManager.MATCH_UNINSTALLED_PACKAGES); 

     List<String> packageNameLst = null; 

     if (infos != null && infos.size() > 0) 
     { 
      packageNameLst = new ArrayList<String>(infos.size()); 

      for(int i=0; i<infos.size(); i++) 
      { 
       ResolveInfo info = infos.get(i); 

       packageNameLst.add(info.activityInfo.packageName); 
       //info.activityInfo.name 
      } 
     } 

     return packageNameLst; 
    } 
Cuestiones relacionadas