Dopo aver letto "Media Playback" e "MediaPlayer" di documenti Android, sono ancora confuso e ho bisogno di un consiglio esperto sul metodo sovraccarico setDataSource.MediaPlayer setDataSource necessita di consigli sulle best practice
Sto utilizzando MediaPlayer
in un componente Service
nel mio progetto che diventerà un foregroundService durante la riproduzione di musica. Ho il mio file musicale (.mp3) nella cartella res/raw
del mio apk. Per iniziare a giocare, so che devo preparare l'oggetto MediaPlayer. Poiché i servizi nelle applicazioni Android utilizzano per impostazione predefinita singolo processo e thread principale, non voglio che i miei utenti ottengano ANR mentre MediaPlayer si prepara (pensa se il file multimediale nella cartella raw ha una dimensione grande). Quindi io uso prepareAsync
anziché prepare
(sincronizzazione). Quindi non posso usare:
mp = MediaPlayer.create(context, R.raw.myfile);
Perché questo richiede già prepare()
internamente ma non prepareAsync()
. Quindi, in pratica ho due opzioni (due da quattro):
Uri myUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.myfile);
mp.setDataSource(context, myUri);
o
AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.myfile);
mp.setDataSource(fd.getFileDescriptor());
afd.close();
dopo aver usato uno di loro posso semplice utilizzo:
mp.prepareAsync();
E finalmente le mie domande sorgono che "compresi questi diversi metodi, qual è l'opzione migliore? Ci sono dei benefici uno sopra l'altro? Mi manca qualcosa?"
Personalmente, mi piace l'ultimo metodo, dal momento che non utilizza le stringhe nel codice. Non lo so ora, se questo conta tanto di un "beneficio", comunque. – Geobits
@Geobits, evitare stringhe costanti nel codice è una buona pratica come so, ma 'FileDescriptor' è ciò che Android preferisce per i file locali. Grazie per il tuo commento. e ti suggerisco di leggere il mio commento sulla risposta accettata. –