2016-03-08 67 views
0

我已經搜索並研究了stackoverflow和谷歌,但無法找到任何答案我的問題。我發現了其他問題和答案,但這與保存在應用程序中的聲音有關,但是我創建了一個應用程序,它從Parse服務器獲取數據,因此它獲取mp3文件並在listview中顯示這些內容,並且與單擊某個項目時相比播放該曲目。但問題在於:當您播放聲音並點擊另一個聲音時,第一個不會停止,第二個會開始播放。 我已經嘗試使用下面的代碼,但它只是不工作。 這裏是我的代碼:Android MediaPlayer:多個聲音同時播放。我的代碼是

play.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       final MediaPlayer mediaPlayer = new MediaPlayer(); 
       final MediaPlayer scndmediaPlayer = new MediaPlayer(); 
       mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
       scndmediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
       if (mediaPlayer.isPlaying()) { 
        Toast.makeText(getContext(), "First is playing", Toast.LENGTH_SHORT).show(); 
        try { 
         mediaPlayer.stop(); 
         scndmediaPlayer.setDataSource(audioFileURL); 
         scndmediaPlayer.prepare(); 
         scndmediaPlayer.start(); 
         //soundtoolbar.setTitle(name); 
        } catch (IllegalArgumentException e1) { 
         e1.printStackTrace(); 
        } catch (SecurityException e1) { 
         e1.printStackTrace(); 
        } catch (IllegalStateException e1) { 
         e1.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } else { 
        try { 
         if (scndmediaPlayer.isPlaying()){ 
          scndmediaPlayer.stop(); 
         } 
         Toast.makeText(getContext(), "First is starting", Toast.LENGTH_SHORT).show(); 
         mediaPlayer.setDataSource(audioFileURL); 
         mediaPlayer.prepare(); 
         mediaPlayer.start(); 
         soundtoolbar.setTitle(name); 
        } catch (IllegalArgumentException e1) { 
         e1.printStackTrace(); 
        } catch (SecurityException e1) { 
         e1.printStackTrace(); 
        } catch (IllegalStateException e1) { 
         e1.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
       playPause.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         if (mediaPlayer.isPlaying() || scndmediaPlayer.isPlaying()) { 
          mediaPlayer.pause(); 
          scndmediaPlayer.pause(); 
          playPause.setBackground(getContext().getDrawable(R.drawable.ic_play_arrow_white_24dp)); 
         } else { 
          mediaPlayer.start(); 
          scndmediaPlayer.start(); 
          playPause.setBackground(getContext().getDrawable(R.drawable.ic_pause_white_24dp)); 
         } 
        } 
       }); 
      } 

     }); 

我創建2個mediaplayers與上面的代碼,當用戶點擊播放按鈕它首先檢查是否有任何的播放器正在運行。 我試圖達到以下目的:當用戶點擊播放按鈕時,它會檢查(1st)mediaPlayer是否在運行。如果它正在運行,它只是停止它並啓動(第二)scndmediaPlayer或反之亦然...如果第二個正在播放它停止並啓動第一個。所以它會創建一個循環:1st正在播放?用戶首先點擊另一個按鈕。第二個啓動。用戶點擊另一個按鈕。首先是玩?第二是玩?是。停下來,開始第一個。 但無法找到我的代碼中的問題。 請幫我這個。我想在2天內解決,但我不能... 謝謝:)

編輯:我使用一個MediaPlayer的,並做了以下嘗試:檢查MediaPlayer正在玩!不,它不是在玩。啓動它。用戶再次單擊該按鈕,它會停止mediaplayer並使用新的audioFileUrl啓動它。但。 MediaPlayer忘記它正在播放。似乎它只是開始軌道,而不是忘記,並檢查是否是真的我設置了一個敬酒:當mediaplayer沒有播放吐司節目時,它顯示每次我點擊列表中的一個軌道,這意味着它忘記了它有一個正在播放的曲目...

編輯2:我設法做到以下幾點:它播放曲目。用戶點擊另一首曲目。它會停止媒體播放器,但不會播放新曲目。用戶再次點擊。它播放着新的曲目。用戶點擊新的跟蹤和應用程序崩潰...

編輯3:發佈我的整個類:

public class MyAdapter extends ParseQueryAdapter<ParseObject> { 

public Button playPause, next, previous; 
public Toolbar soundtoolbar; 
boolean isPlaying = false; 
public MyAdapter(Context context) { 

    super(context, new ParseQueryAdapter.QueryFactory<ParseObject>() { 
     public ParseQuery create() { 
      ParseQuery query = new ParseQuery("MyClass"); 
      query.orderByDescending("createdAt"); 
      return query; 
     } 
    }); 
} 


@Override 
public View getItemView(final ParseObject object, View v, final ViewGroup parent) { 

    if (v == null) { 
     v = View.inflate(getContext(), R.layout.activity_audio_files_item, null); 
    } 
    super.getItemView(object, v, parent); 

    final Button play = (Button) v.findViewById(R.id.play); 
    playPause = TabFragment1.playPause; 
    next = TabFragment1.next; 
    previous = TabFragment1.previous; 
    soundtoolbar = TabFragment1.soundtoolbar; 
    final ParseFile descr = object.getParseFile("audiofile"); 
    final String name = object.getString("name"); 
    final String audioFileURL = descr.getUrl(); 
    final SlidingUpPanelLayout slidingUpPanelLayout = TabFragment1.spanel; 
    play.setText(name); 
    final MediaPlayer mediaPlayer = new MediaPlayer(); 
    play.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
       if (isPlaying != true) { 
       Toast.makeText(getContext(), name+" is playing", Toast.LENGTH_SHORT).show(); 
       try { 
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
        mediaPlayer.setDataSource(audioFileURL); 
        mediaPlayer.prepareAsync(); 
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
         @Override 
         public void onPrepared(MediaPlayer mp) { 
          soundtoolbar.setTitle(name); 
          slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED); 
          mediaPlayer.start(); 
          isPlaying = true; 
         } 
        }); 
       } catch (IllegalArgumentException e1) { 
        e1.printStackTrace(); 
       } catch (SecurityException e2) { 
        e2.printStackTrace(); 
       } catch (IllegalStateException e3) { 
        e3.printStackTrace(); 
       } catch (IOException e4) { 
        e4.printStackTrace(); 
       } catch (NullPointerException e5) { 
        e5.printStackTrace(); 
       } 
      } else { 
       mediaPlayer.stop(); 
       Toast.makeText(getContext(), "Starting "+name, Toast.LENGTH_SHORT).show(); 
       try { 
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
        mediaPlayer.prepareAsync(); 
        mediaPlayer.setDataSource(audioFileURL); 
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
         @Override 
         public void onPrepared(MediaPlayer mp) { 
          soundtoolbar.setTitle(name); 
          slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED); 
          mediaPlayer.start(); 
         } 
        }); 
       } catch (IllegalArgumentException e1) { 
        e1.printStackTrace(); 
       } catch (SecurityException e2) { 
        e2.printStackTrace(); 
       } catch (IllegalStateException e3) { 
        e3.printStackTrace(); 
       } catch (IOException e4) { 
        e4.printStackTrace(); 
       } catch (NullPointerException e5){ 
        e5.printStackTrace(); 
       } 
      } 
      playPause.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (mediaPlayer.isPlaying()) { 
         mediaPlayer.pause(); 
         playPause.setBackground(getContext().getDrawable(R.drawable.ic_play_arrow_white_24dp)); 
        } else { 
         mediaPlayer.start(); 
         playPause.setBackground(getContext().getDrawable(R.drawable.ic_pause_white_24dp)); 
        } 
       } 
      }); 
     } 

    }); 
    return v; 
} 
} 

有人請幫助...

回答

0

我建議你結帳的Soundpool。我會幫助你。還有一件事,你可能會把媒體網址放到數組或類似的東西上。並且使用一個mediaPlayer順便說一下,你會避免使用兩個mediaPlayer並避免內存泄漏。

http://developer.android.com/reference/android/media/SoundPool.html

+0

我不熟悉SoundPool,所以我想繼續使用MediaPlayer。我嘗試使用一個MediaPlayer並執行以下操作:檢查mediaplayer是否正在播放!不,它不是在玩。啓動它。用戶再次單擊該按鈕,它會停止mediaplayer並使用新的audioFileUrl啓動它。但。 MediaPlayer忘記它正在播放。似乎它只是開始軌道,而不是忘記,並檢查它是否屬實我設置了Toast:當mediaplayer沒有播放Toast節目時,每當我點擊列表中的一個曲目,這意味着它忘記它有一個軌道正在播放... – Asama

+0

我遇到過與您類似的mediaPlayer問題。然後,我將視圖更改爲我的代碼。可以使用一個密鑰來存儲mediaPlayer狀態,然後檢查它的形式。 –

+0

請檢查我的編輯3.我發佈了我的整個班級。也許現在很容易理解...... – Asama