Problemi con MediaPlayer, risorse grezze, arresto e avvio

Sono nuovo allo sviluppo di Android e ho una domanda / problema.

Sto giocando in giro con la class MediaPlayer per riprodurre alcuni suoni / musica. Sto giocando risorse grezze ( res/raw ) e sembra un po 'facile.

  • Principi di funzionamento di Android Push NotificationSystem
  • Il modo più veloce per disegnare sprites in opengles 2.0 su android
  • Ottieni il path della risorsa Android
  • Android Studio non funziona mentre crea l'applicazione utilizzando AppCompat v23 e API21
  • Pulsante Android con diversi colors di background
  • Errore GCM - googleCloudMessaging.register
  • Per riprodurre una risorsa cruda, il MediaPlayer deve essere inizializzato in questo modo:

     MediaPlayer mp = MediaPlayer.create(appContext, R.raw.song); mp.start(); 

    Fin qui non c'è nessun problema. Il suono viene suonato e tutto funziona bene. Il mio problema viene visualizzato quando desidero aggiungere più opzioni alla mia applicazione. In particolare quando aggiungo il button "Stop" / opzione.

    Fondamentalmente, quello che voglio fare è … quando premo "Stop", la musica si arresta. E quando premo "Start", il brano / suono inizia. (piuttosto semplice!)

    Per arrestare il lettore multimediale devi solo call stop() . Ma per riprodurre nuovamente il suono, il lettore multimediale deve essere resettato e preparato.

     mp.reset(); mp.setDataSource(params); mp.prepare(); 

    Il problema è che il metodo setDataSource() accetta solo come parame un path di file, URI del contenuto, il path URL di streaming o il descrittore di file.

    Quindi, poiché questo metodo non accetta un identificatore di risorse, non so come impostare l'origine dati per call prepare() . Inoltre, non capisco perché non è ansible utilizzare un identificatore Resouce per impostare l'origine dati, ma è ansible utilizzare un identificatore di risorse durante l'initialization di MediaPlayer.

    Suppongo che manchi qualcosa. Mi chiedo se sto mixando concetti, e il metodo stop() non deve essere chiamato nel button "Stop". Qualsiasi aiuto?

    Grazie in anticipo!!!

  • Il file Flash non viene visualizzato in webview
  • Salvare l'image su sdcard dalla risorsa drawble su Android
  • Come posso get il nome del dispositivo in Android?
  • Android: model di ViewHolder e diversi tipi di righe?
  • Controllare se il record esiste nel database android
  • Applicazione nativa Android di Android non funziona sul dispositivo effettivo
  • 6 Solutions collect form web for “Problemi con MediaPlayer, risorse grezze, arresto e avvio”

    Ecco cosa ho fatto per caricare più risorse con un unico MediaPlayer:

     /** * Play a sample with the Android MediaPLayer. * * @param resid Resource ID if the sample to play. */ private void playSample(int resid) { AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid); try { mediaPlayer.reset(); mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); mediaPlayer.prepare(); mediaPlayer.start(); afd.close(); } catch (IllegalArgumentException e) { Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e); } catch (IllegalStateException e) { Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e); } catch (IOException e) { Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e); } 

    mediaPlay è una variabile membro che viene creata e rilasciata in altri punti della class. Questo potrebbe non essere il modo migliore (io sono nuovo a Android io stesso), ma sembra funzionare. Basta notare che il codice probabilmente scenderà in fondo al metodo prima che il mediaPlayer venga svolto. Se hai bisogno di riprodurre una serie di risorse, dovrai ancora gestire questo caso.

    questo è il modo in cui funziona il metodo MediaPlayer.create per aprire un file raw:

      public static MediaPlayer create(Context context, int resid) { try { AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid); if (afd == null) return null; MediaPlayer mp = new MediaPlayer(); mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); afd.close(); mp.prepare(); return mp; } catch (IOException ex) { Log.d(TAG, "create failed:", ex); // fall through } catch (IllegalArgumentException ex) { Log.d(TAG, "create failed:", ex); // fall through } catch (SecurityException ex) { Log.d(TAG, "create failed:", ex); // fall through } return null; } 

    Oppure, puoi accedere alla risorsa in questo modo:

     mediaPlayer.setDataSource(context, Uri.parse("android.resource://com.package.name/raw/song")); 

    where com.package.name è il nome del tuo pacchetto di applicazioni

    Puoi usare

     mp.pause(); mp.seekTo(0); 

    per interrompere il lettore musicale.

    Infine, come funziona per me:

     public class MainStart extends Activity { ImageButton buttonImage; MediaPlayer mp; Boolean playing = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); buttonImage = (ImageButton)findViewById(R.id.ButtonID); buttonImage.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(playing){ mp.stop(); playing = false; }else{ mp = MediaPlayer.create(getApplicationContext(), R.raw.sound_u_want); mp.start(); playing = true; } } }); } } 

    SIG. Rettangolo, questo messaggio forse troppo tardi per questo, ma con orgoglio scrivere questi codici alla tua idea: ho mp per mediaplayer e sescal9 è un button .

     .... if(btnClicked.getId() == sescal9_ornek_muzik.getId()) { mp.start(); mp.seekTo(380); mp2.start(); mp2.seekTo(360); mp3.start(); mp3.seekTo(340); ... } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.