0

我有類似下面我的佈局xml文件顯示:Android的MediaPlayer的檢查情況

Song1 playbutton 
Song2 playbutton 
Song3  playbutton 

當鬆1 PLAYBUTTON以往用戶點擊我需要打鬆1,中間如果Song2 PLAYBUTTON用戶點擊有我需要檢查Song2和Song3 mediapalyer實例

我得到IllegalStateException和有些時候NullPointerException 如何檢查,任何人都可以幫助嗎?

這裏我的代碼:

MediaPlayer mp1=new MediaPlayer(); 
MediaPlayer mp2=new MediaPlayer(); 

playbtn.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       if(mp2!=null){ 
       if(mp2.isPlaying()){ 
        mp2.stop(); 
        mp2.release(); 
        mp2=null; 

        play20.setVisibility(View.VISIBLE); 




       } 
       } 
       playbtn.setVisibility(View.INVISIBLE); 
       pausebtn.setVisibility(View.VISIBLE); 

       try { 

        Log.d("Start Media Player", "Start Media Player"); 
        AssetFileDescriptor descriptor = MediaActivity.this 
          .getApplicationContext().getAssets() 
          .openFd("volumc.mp3"); 
        mp1.setDataSource(descriptor.getFileDescriptor(), 
          descriptor.getStartOffset(), descriptor.getLength()); 
        // descriptor.close(); 
        mp1.prepare(); 
        mp1.setLooping(true); 
        mp1.start(); 


       } catch (IllegalArgumentException e) { 
        e.printStackTrace(); 
       } catch (IllegalStateException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     pausebtn.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 

       Log.d("pausebtn", "pausebtn"); 
       playbtn.setVisibility(View.VISIBLE); 
       pausebtn.setVisibility(View.INVISIBLE); 

       mp1.stop(); 
       mp1.release(); 
       mp1=null; 


      } 
     }); 

     // 20 

     play20.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 

       if(mp1!=null){ 
       if(mp1.isPlaying()){ 
        mp1.stop(); 
        mp1.release(); 
        mp1=null; 
        playbtn.setVisibility(View.VISIBLE); 



       } 
       } 
       play20.setVisibility(View.INVISIBLE); 
       pause20.setVisibility(View.VISIBLE); 

       try { 

        Log.d("Start Media Player", "Start Media Player"); 
        AssetFileDescriptor descriptor = MediaActivity.this 
          .getApplicationContext().getAssets() 
          .openFd("volumc.mp3"); 
        mp2.setDataSource(descriptor.getFileDescriptor(), 
          descriptor.getStartOffset(), descriptor.getLength()); 
        // descriptor.close(); 
        mp2.prepare(); 
        mp2.setLooping(true); 
        mp2.start(); 

       } catch (IllegalArgumentException e) { 
        e.printStackTrace(); 
       } catch (IllegalStateException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     pause20.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 

       Log.d("pausebtn", "pausebtn"); 
       play20.setVisibility(View.VISIBLE); 
       pause20.setVisibility(View.INVISIBLE); 

       mp2.stop(); 
       mp2.release(); 


      } 
     }); 
+0

請看一看的答案,標記爲接受,如果它幫助。 – johntheripp3r

回答

1

不要,每個按鈕使用一個媒體播放器實例。創建許多實例將不會受益。相反,只需創建一個mediaplayer實例並檢查音樂是否正在播放。
你總是可以做出一個方法來停止播放媒體播放器一樣

private void stopAndStartMediaPlayer(String datasource) 
{ 
    if(mp.isPlaying()) 
     mp.stop(); 
    mp.reset(); 
    mp.setDataSource(datasource); 
    mp.prepare(); 
    mp.start(); 
} 
+0

你應該在'setDataSource(...)'之前調用'reset()',並在'start()'之前調用'prepare()'。還有一個問題:isPlaying()在暫停時返回false,但也許他沒有在這個應用程序中使用「pause()」。 – Dave

+0

@Dave我只是建議user2580568他應該這樣做的方法。這不是確切的代碼,但他可以做這樣的事情。所以**在你DOWNVOTE之前仔細閱讀。**我已經提到他可以在代碼上方做一些**「like」**。 – johntheripp3r