2016-08-09 73 views
0

Ich erstelle eine Audiowiedergabeanwendung. Ich habe gerade zwei Tracks hinzugefügt, aber letztendlich muss ich noch viel mehr hinzufügen ... Ich habe zur Zeit zwei verschiedene Mediaplayer erstellt, um beide Tracks laufen zu lassen, allerdings wird die Anzahl der Tracks mit dieser Prozedur zu Problemen führen Mangel an Leistung!Mehrere Audiospuren in derselben Aktivität

Gibt es einen Weg, wie ich das besser und generischer codieren kann?

Hier ist der Java-Code

public class ChantsFragment extends Fragment { 

    TextView text1, text2 
    ImageButton play1, play2, pause1, pause2, repeatoff1, repeatoff2, repeaton1, repeaton2, stop1, stop2; 
    MediaPlayer mediaPlayer1, mediaPlayer2; 
    Toast on, off; 

    public ChantsFragment() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_chants, container, false); 


     play1 = (ImageButton) view.findViewById(R.id.play1); 
     play2 = (ImageButton) view.findViewById(R.id.play2); 
     pause1 = (ImageButton) view.findViewById(R.id.pause1); 
     pause2 = (ImageButton) view.findViewById(R.id.pause2); 
     repeatoff1 = (ImageButton) view.findViewById(R.id.repeatoff1); 
     repeatoff2 = (ImageButton) view.findViewById(R.id.repeatoff2); 
     repeaton1 = (ImageButton) view.findViewById(R.id.repeaton1); 
     repeaton2 = (ImageButton) view.findViewById(R.id.repeaton2); 
     stop1 = (ImageButton) view.findViewById(R.id.stop1); 
     stop2 = (ImageButton) view.findViewById(R.id.stop2); 

     mediaPlayer1 = MediaPlayer.create(getActivity(), R.raw.audio1); 
     mediaPlayer2 = MediaPlayer.create(getActivity(), R.raw.audio2); 

     on = Toast.makeText(getActivity(), "The chant will repeat itself", Toast.LENGTH_LONG); 
     off = Toast.makeText(getActivity(), "The chant will no longer repeat itself", Toast.LENGTH_LONG); 

     //Track 1 

     text1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mediaPlayer1 != null && mediaPlayer1.isPlaying()) { 
        text1.setClickable(false); 
       } 

       if (mediaPlayer2 != null && mediaPlayer2.isPlaying()) { 
        mediaPlayer2.stop(); 
        mediaPlayer2.release(); 
        mediaPlayer2 = null; 
        play2.setVisibility(View.GONE); 
        pause2.setVisibility(View.GONE); 
        repeatoff2.setVisibility(View.GONE); 
        repeaton2.setVisibility(View.GONE); 
        stop2.setVisibility(View.GONE); 
       } 

       if (mediaPlayer1 == null) { 
        mediaPlayer1 = MediaPlayer.create(getActivity(), R.raw.audio1); 
       } else { 
        text1.setClickable(true); 
        mediaPlayer1.start(); 
        play1.setVisibility(View.GONE); 
        pause1.setVisibility(View.VISIBLE); 
        repeatoff1.setVisibility(View.VISIBLE); 
        stop1.setVisibility(View.VISIBLE); 
       } 

       mediaPlayer1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
        @Override 
        public void onCompletion(MediaPlayer mp) { 
         play1.setVisibility(View.GONE); 
         pause1.setVisibility(View.GONE); 
         repeatoff1.setVisibility(View.GONE); 
         repeaton1.setVisibility(View.GONE); 
         stop1.setVisibility(View.GONE); 
        } 
       }); 
      } 
     }); 


     play1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       play1.setVisibility(View.GONE); 
       pause1.setVisibility(View.VISIBLE); 
       mediaPlayer1.start(); 
      } 
     }); 

     pause1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       play1.setVisibility(View.VISIBLE); 
       pause1.setVisibility(View.GONE); 
       mediaPlayer1.pause(); 
      } 
     }); 

     repeatoff1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mediaPlayer1.setLooping(true); 
       repeatoff1.setVisibility(View.GONE); 
       repeaton1.setVisibility(View.VISIBLE); 
       on.show(); 
       off.cancel(); 
      } 
     }); 

     repeaton1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mediaPlayer1.setLooping(false); 
       repeaton1.setVisibility(View.GONE); 
       repeatoff1.setVisibility(View.VISIBLE); 
       off.show(); 
       on.cancel(); 
      } 
     }); 

     stop1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mediaPlayer1.stop(); 
       mediaPlayer1 = null; 
       text1.setClickable(true); 
       play1.setVisibility(View.GONE); 
       pause1.setVisibility(View.GONE); 
       repeatoff1.setVisibility(View.GONE); 
       repeaton1.setVisibility(View.GONE); 
       stop1.setVisibility(View.GONE); 
      } 
     }); 

     //Track 2 

     text2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mediaPlayer2 != null && mediaPlayer2.isPlaying()) { 
        text2.setClickable(false); 
       } 

       if (mediaPlayer1 != null && mediaPlayer1.isPlaying()) { 
        mediaPlayer1.stop(); 
        mediaPlayer1.release(); 
        mediaPlayer1 = null; 
        play1.setVisibility(View.GONE); 
        pause1.setVisibility(View.GONE); 
        repeatoff1.setVisibility(View.GONE); 
        repeaton1.setVisibility(View.GONE); 
        stop1.setVisibility(View.GONE); 
       } 

       if (mediaPlayer2 == null) { 
        mediaPlayer2 = MediaPlayer.create(getActivity(), R.raw.audio2); 
       } else { 
        text2.setClickable(true); 
        mediaPlayer2.start(); 
        play2.setVisibility(View.GONE); 
        pause2.setVisibility(View.VISIBLE); 
        repeatoff2.setVisibility(View.VISIBLE); 
        stop2.setVisibility(View.VISIBLE); 
       } 

       mediaPlayer2.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
        @Override 
        public void onCompletion(MediaPlayer mp) { 
         play2.setVisibility(View.GONE); 
         pause2.setVisibility(View.GONE); 
         repeatoff2.setVisibility(View.GONE); 
         repeaton2.setVisibility(View.GONE); 
         stop2.setVisibility(View.GONE); 
        } 
       }); 
      } 
     }); 

     play2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       play2.setVisibility(View.GONE); 
       pause2.setVisibility(View.VISIBLE); 
       mediaPlayer2.start(); 
      } 
     }); 

     pause2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       play2.setVisibility(View.VISIBLE); 
       pause2.setVisibility(View.GONE); 
       mediaPlayer2.pause(); 
      } 
     }); 

     repeatoff2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mediaPlayer2.setLooping(true); 
       repeatoff2.setVisibility(View.GONE); 
       repeaton2.setVisibility(View.VISIBLE); 
       on.show(); 
       off.cancel(); 
      } 
     }); 

     repeaton2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mediaPlayer2.setLooping(false); 
       repeaton2.setVisibility(View.GONE); 
       repeatoff2.setVisibility(View.VISIBLE); 
       off.show(); 
       on.cancel(); 
      } 
     }); 

     stop2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mediaPlayer2.stop(); 
       mediaPlayer2 = null; 
       text2.setClickable(true); 
       play2.setVisibility(View.GONE); 
       pause2.setVisibility(View.GONE); 
       repeatoff2.setVisibility(View.GONE); 
       repeaton2.setVisibility(View.GONE); 
       stop2.setVisibility(View.GONE); 
      } 
     }); 

     return view; 
    } 

bearbeiten

ich derzeit rund 10 Titel über das Hinzufügen von unten auf die Anwendung auf Null gestellt haben. Ich möchte, dass die Wiedergabe auf dem aktuellen Titel stoppt (falls abgespielt wird), sobald ein anderer Titel ausgewählt wird. Wenn Sie den Media Player verwenden, um das gleiche zu tun, müssen Sie separat prüfen, ob 9 Mediaplayer abgespielt werden! (Es sei denn natürlich gibt es eine andere Möglichkeit, dies zu tun, die ich völlig verpasst habe)

Antwort

0

Nun, zum Abspielen mehrerer Audio-Dateien auf einmal scheint SoundPool Ihre beste Wahl vor allem, weil es viel leichter und Sie können die Anzahl steuern von Bächen. Sie können eine neue SoundPool Instanz erstellen, wie:

SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 100); // 10 = maxStreams, 100 = quality 

Sie dann verschiedene Töne hinein, als Laden beginnen:

int soundId1 = soundPool.load(context, R.raw.audio1, 1); 
int soundId2 = soundPool.load(context, R.raw.audio2, 1); 
... 

Sie die Wiedergabe wie steuern:

int idBeingPlayed = soundPool.play (soundID, 1, 1, 1, -1, 1); // volume params, returns the streamId 

Andere Kontrollen:

soundPool.pause(streamID); 
soundPool.resume(streamID); 

Für weitere Informationen besuchen Sie die . Hoffe das hilft!

+0

Ich habe versucht, Sound Pool zu verwenden, aber das Problem, mit dem ich konfrontiert bin, ist es lässt mich nicht überprüfen, ob ein Sound gerade spielt. Wenn Sie meinen Code oben durchgehen, möchte ich, dass ein bestimmter Titel aufhört zu spielen, wenn ich einen anderen Titel auswähle, etwas, den ich über den Media Player erreichen konnte. Ich füge derzeit ungefähr 10 Tracks hinzu, und ich möchte, dass die Wiedergabe auf dem aktuellen Track stoppt (wenn ich spiele), wenn ich einen anderen Track wähle! Und das Verwenden des Media Players, um dies zu tun, bedeutet extrem lange Codezeilen, und wenn ich dem Code sogar einen neuen Track hinzufügen muss, wird es ein Durcheinander sein! – Devansh

+0

Nun in dem 'play'call in meinem Code oben, speichere ich auch die' idBeingPlayed' Variable. Der Aufruf von 'soundPool.pause (idBeingPlayed);' vor dem Aufruf der Wiedergabe einer anderen ID stoppt nicht die aktuelle Wiedergabe? – Shaishav

+0

Wenn ich Pause oder Stopp anrufe, ohne dass es tatsächlich abgespielt wird, löst es eine NullPointer-Ausnahme aus und die App stürzt – Devansh