2016-08-09 5 views
0

私はオーディオ再生アプリケーションを作成しています。私は現在2つのトラックを追加しましたが、最終的にはさらに追加する必要があります...私は現在、両方のトラックを実行する2つの異なるメディアプレーヤーを作成しましたが、この手順を使用してトラックの数が増加すると、パフォーマンスの欠如!複数のオーディオトラックが同じアクティビティにあります

これをコード化する方法はありますか?

ここでは、Javaコード

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; 
    } 

編集

は、私は現在のアプリケーションに10台のトラックの周りに追加することでダウンゼロましです。私は別のトラックが選択された瞬間に現在のトラック(再生している場合)で再生を停止し、同じようにメディアプレーヤーを使用すると、9人のメディアプレーヤーが再生している場合に別々にチェックすることを意味します。 (私が完全に逃したこれを行う別の方法がない限り)

答えて

0

複数のオーディオファイルを一度に再生するには、より軽量で番号を制御できるので、SoundPoolが主に最適ですストリームの。

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

その他のコントロール:あなたのように再生を制御することができます

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

:あなたはその後、としてそれに異なるサウンドのロードを開始することができます

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

:あなたは、新しいSoundPoolインスタンスを作成することができます。

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

詳細については、offfical docsをご覧ください。お役に立てれば!

+0

サウンドプールを使用しようとしましたが、私が直面している問題は、サウンドが現在再生中であるかどうかを確認できないことです。上記のコードを実行すると、別のトラックを選択したときに特定のトラックの再生を停止することができます。これは、メディアプレーヤーで達成できたものです。私は現在約10曲を追加しており、別の曲を選んだときに現在の曲(再生している場合)で再生を停止したいです!そして、メディアプレーヤーを使用すると、コードが非常に長くなることになります。コードに1つの新しいトラックを追加する必要がある場合は、混乱するでしょう! – Devansh

+0

上記の私のコードの 'play'呼び出しで' idBeingPlayed'変数も保存しています。別のIDで再生を呼び出す前に 'soundPool.pause(idBeingPlayed); 'を呼び出しても、現在の再生IDは停止しません。 – Shaishav

+0

実際に再生せずに一時停止または停止を呼び出すと、NullPointer例外がスローされ、アプリがクラッシュする – Devansh

関連する問題