2011-01-03 11 views
5

Nella mia app ho una voce di menu che voglio aprire il lettore multimediale preferito dell'utente, interessato solo all'audio. Idealmente, la prima volta che l'utente sceglie questo elemento, sceglierebbe l'unico lettore multimediale sul telefono se ne ha solo uno installato o presentandoli con una lista se ne ha più di uno. Vorrei quindi salvare la loro scelta, così la prossima volta l'aprirà.Come ottenere un elenco di lettori multimediali installati

Come ho capito, Android non ha un lettore multimediale predefinito. Ho il Droid originale e ha un lettore multimediale, ma capisco che altri operatori usano il proprio, o l'utente può disinstallare quello standard.

Ho provato alcune cose ma non riesco a far funzionare nulla.

Ho provato questo codice, che dovrebbe ottenere un elenco di pacchetti che supportano l'intento. Funziona per alcune cose come "application/pdf" e "video/*". Quando provo con "audio/*" ottengo una lista vuota, anche se ho installato sia il lettore multimediale Android che MixZing. Ho anche provato con "media/*" e non ottenere nulla.

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

Ho visto questo codice che funziona e apre un file audio con il lettore predefinito, però io non voglio aprire un file, voglio solo aprire l'applicazione audio come se l'utente ha aperto dal cassetto delle applicazioni.

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

L'unica altra cosa che posso pensare di fare è uscire e ottenere i nomi dei pacchetti dei più popolari lettori multimediali e difficile loro codice e cercare il telefono per vedere quali sono installati, ma questo doesn' t mi sembra l'approccio migliore. Non capisco perché il primo bit di codice non funzioni. Forse i filtri intent non sono impostati correttamente per quelle app o sto usando il codice sbagliato oi tipi mime.

+0

La seconda parte di codice fa esattamente quello che voglio quando viene avviata l'attività. Mi presenta un elenco di app sul mio telefono in grado di gestire l'intento. Non riesco proprio a trovare un modo per generare quella lista da solo, così posso manipolare le cose. Non voglio iniziare l'attività, ma solo ottenere i dati che il sistema operativo utilizza per generare quell'elenco. – Bob

+0

OK Penso di averlo funzionante. Pubblicherò la soluzione quando l'avrò. – Bob

+0

Questo potrebbe funzionare anche per te: http://stackoverflow.com/questions/18161237/list-installed-media-players-android/21658150#21658150 – yado

risposta

6

OK ecco come chiedere al sistema operativo un elenco di lettori audio installati.

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 saranno quindi popolata con oggetti ResolveInfo per ogni applicazione sul telefono che pretende di gestire l'audio. Da ResolveInfo puoi ottenere cose come il nome del pacchetto per avviare l'attività, puoi ottenere icone e nomi di app. Lo uso per popolare una finestra di dialogo personalizzata che assomigli e funzioni come la finestra di dialogo Android di serie per la scelta di un'attività da avviare. Ho anche la possibilità per l'utente di impostare l'app scelta come predefinita.

Questo non è perfetto. Sei in balia del sistema operativo e dei filtri intent dell'applicazione. Ho provato questo con alcuni telefoni e le seguenti app si presentano correttamente: riproduttore multimediale per Droid originale, riproduttore multimediale per telefoni HTC, doubleTwist e MixZing. Tuttavia, ho installato Zimly e non si presenta. Sospetto che i filtri di intent non siano impostati per l'audio.

Mi sono anche preoccupato che ci possano essere casi in cui MediaStore.Audio.Media.INTERNAL_CONTENT_URI non ha audio. Ho provato questo codice immediatamente dopo un riavvio e funziona. Non l'ho provato su un telefono senza supporto utente installato.

+0

ho provato il tuo codice, sta ricevendo il lettore multimediale, c'è qualche codice per accedere all'elenco dei file audio e di vedio memorizzati nel dispositivo. –

+0

Ciao Bob, come fai a visualizzare l'elenco di app ?? grazie – Ivan

+0

@Bob: questo mi dà 'W/ContentResolver: impossibile ottenere il tipo per: content: // media/external/audio/media/1 (URL sconosciuto: contenuto: // media/external/audio/media/1) 'errore durante l'esecuzione ... È necessaria l'autorizzazione per aggiungere 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); 

Ecco la mia soluzione, se si vuole ottenere un elenco di "/ VIDEO" o "/ audio" apps, si dovrebbe usare "setDataAndType"; Ma se vuoi ottenere una lista di APP "text/*" o "pdf", puoi usare "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); 

Penso che sia meglio!

+1

sarebbe una buona idea indicare perché pensi che sia meglio. – Dreamwalker

0

Per il mio Samsung Galaxy S4 con versione Android 5.0, nessuna delle soluzioni precedenti funziona, ma ho trovato un'altra soluzione. Funziona perfettamente. Ecco il codice per qualcuno che potrebbe aver bisogno di aiuto.

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

/* Per il mio Samsung Galaxy S4 in esecuzione Android versione 5.0, nessuna delle soluzioni di cui sopra funziona ma ho trovato un'altra soluzione. Funziona perfettamente. Ecco il codice per qualcuno che potrebbe aver bisogno di aiuto. */

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

Questa è l'unica soluzione che funziona anche per i nuovi telefoni! – 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; 
    } 
Problemi correlati