MediaPlayerService, Probleme bei Wiedergabe

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • MediaPlayerService, Probleme bei Wiedergabe

    Moin,

    ich bin gerade dabei einen Audioplayer zu coden und bin auf einige offene Fragen gestoßen... Habe etwas rumgegoogelt, aber alles was ich gefunden habe, hat mich nicht zufireden gestellt. Die eine oder andere Lösung hätte vielleicht mein Problem gelöst, aber das hilft mir nicht wirklich, wenn ich das nicht nachvollziehen kann.

    Ich habe mich dazu entschieden den Audioplayer als Service umzusetzen, da ich einen Soundboard, bzw. background Soundmixer programmieren möchte und denke, dass ich mit einem Service besser darstehe, als mit einer AudioPlayer Activity. Nun habe ich eine Activity erstellt, die den Service zwar aufruft, aber die Dateien werden nicht abgespielt, kann das noch nicht so richtig nachvollziehen warum. Ich zeige euch mal vielleicht den Code und ihr hilft mir das Problem zu lokalisieren :)

    Das ist der Inhalt der onCreate() Methode in meiner Activity. Hier sollte der Service gestartet werden.

    Quellcode

    1. Button play = findViewById(R.id.play);
    2. Button pause = findViewById(R.id.pause);
    3. play.setOnClickListener(new View.OnClickListener() {
    4. @Override
    5. public void onClick(View v) {
    6. startService(new Intent(new Intent(PlayerClient.this, MediaPlayerService.class)));
    7. }
    8. });
    9. pause.setOnClickListener(new View.OnClickListener() {
    10. @Override
    11. public void onClick(View v) {
    12. stopService(new Intent(new Intent(PlayerClient.this, MediaPlayerService.class)));
    13. }
    14. });
    Alles anzeigen


    Das hier ist der MediaPlayerService

    Quellcode

    1. MediaPlayer mediaPlayer;
    2. @Nullable
    3. @Override
    4. public IBinder onBind(Intent intent) {
    5. return null;
    6. }
    7. @Override
    8. public void onCreate(){
    9. System.out.println("started");
    10. mediaPlayer = new MediaPlayer();
    11. mediaPlayer.create(getApplicationContext(), R.raw.song);
    12. mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    13. @Override
    14. public void onPrepared(MediaPlayer mp) {
    15. mp.start();
    16. }
    17. });
    18. }
    19. @Override
    20. public void onDestroy() {
    21. System.out.println("stopped");
    22. super.onDestroy();
    23. if (mediaPlayer != null) mediaPlayer.release();
    24. }
    Alles anzeigen


    Die Datei "song.mp3" in res/raw habe ich hinterlegt. Die system.outs erscheinen in der console. Das Service in AndroidManifest.xml ist da. Wo ist also das Problem?
  • Hallo was mir als erstes auf fällt ist.

    Warum zweimal Intent ?

    startService(new Intent(new Intent(PlayerClient.this, MediaPlayerService.class)));


    Frage was für einen Service willst du machen einen normalen oder einen Intent Service?

    Für beide hast du keine ausführende Methode.


    Normaler gebunden oder nichtgebunden ist es die „onStartComand“

    IntentServise„onHandleIntent“

    Die aufgerufen wird in der du deine Musik abspielen solltest.



    zoftino.com/android-intentservice-example

    vogella.com/tutorials/AndroidServices/article.html



    da du die Klassen Def. nicht mitgegeben hast weiß ich nicht was du machen willst.
    Ein Feedback auf Tipps ist auch schön. :P
  • jogimuc schrieb:

    Warum zweimal Intent ?

    startService(new Intent(new Intent(PlayerClient.this, MediaPlayerService.class)));
    War ein copy-paste Fehler.

    Ich habe das ganze etwas nachgebessert, es gibt jetzt onStartCommand. Ich zeige es vielleicht einamal:

    Das ist mein Client (die Activity)

    Quellcode

    1. /**
    2. * MediaPlayer client. Communicates with the MediaPlayerService
    3. */
    4. public class MediaPlayer extends Activity {
    5. @Override
    6. protected void onCreate(Bundle savedInstanceState) {
    7. super.onCreate(savedInstanceState);
    8. setContentView(R.layout.player_client);
    9. Button play = findViewById(R.id.play);
    10. Button pause = findViewById(R.id.pause);
    11. play.setOnClickListener(new View.OnClickListener() {
    12. @Override
    13. public void onClick(View v) {
    14. startService(new Intent(MediaPlayer.this, MediaPlayerService.class));
    15. }
    16. });
    17. pause.setOnClickListener(new View.OnClickListener() {
    18. @Override
    19. public void onClick(View v) {
    20. stopService(new Intent(MediaPlayer.this, MediaPlayerService.class));
    21. }
    22. });
    23. }
    24. }
    Alles anzeigen


    Das ist mein Service:

    Quellcode

    1. /**
    2. * Handles client requests and the media player service.
    3. */
    4. public class MediaPlayerService extends Service {
    5. MediaPlayer mp = new MediaPlayer();
    6. @Override
    7. public int onStartCommand(Intent intent, int flags, int startId) {
    8. mp.create(this, Settings.System.DEFAULT_RINGTONE_URI);
    9. mp.setLooping(true);
    10. mp.start();
    11. return Service.START_STICKY;
    12. }
    13. @Override
    14. public void onDestroy(){
    15. super.onDestroy();
    16. mp.stop();
    17. }
    18. @Nullable
    19. @Override
    20. public IBinder onBind(Intent intent) {
    21. return null;
    22. }
    23. }
    Alles anzeigen


    Wenn der Button "Play" gedruckt wird, kommt folgender Error:

    E/MediaPlayerNative: start called in state 1, mPlayer(0x0)
    error (-38, 0)
    E/MediaPlayer: Error (-38,0)
  • Also die Instanz media Player brauchst du nicht.
    Und wenn doch bitte nicht im Klassenrumpf bei android bitte keine Statements im klassenrumpf.

    MediaPlayer mp; im Rumpf reicht.

    Im service

    • mp = MediaPlayer. create(this, Settings.System.DEFAULT_RINGTONE_URI) ";


    codeunplug.com/android-service…playing-default-ringtone/
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()