2014-04-09 47 views
1

我正在使用與媒體播放器關聯的媒體控制器播放聲音。問題在於媒體控制器一旦失去焦點就會隱藏起來。我有一個按鈕,當按下按鈕時,播放聲音,媒體控制器顯示在屏幕底部。Android Media Controller在隱藏焦點時隱藏

但是當按下生命暫停時,在5秒鐘之後,媒體控制器自己隱藏。

這裏是我的代碼的一部分。我只要媒體控制器隱藏,使聲音不連續打出

所有代碼的媒體控制器停止媒體播放器有:

 mediaPlayer = new MediaPlayer(); 
          mediaPlayer.setOnPreparedListener(currentFragment); 

          mediaController = new MediaController(getActivity()){ 
           @Override 
           public void hide() 
           { 

            if(mediaPlayer.isPlaying()){ 
             mediaPlayer.stop(); 
            } 
            super.hide(); 
           } 
          }; 


           try { 
           mediaPlayer.setDataSource(sound.getSound()); 
           mediaPlayer.prepareAsync(); 
          } catch (IllegalArgumentException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } catch (SecurityException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } catch (IllegalStateException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } catch (IOException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 

           mediaPlayer.start(); 


    @Override 
      public void onPrepared(MediaPlayer mp) { 
       Log.d("media status", "onPrepared"); 



       handler.post(new Runnable() { 
        public void run() { 

         launchMediaController(); 
         progress.dismiss(); 
        } 
       }); 

      } 



void launchMediaController(){ 
      mediaController.setEnabled(true); 

      mediaPlayer.start(); 
      mediaController.setMediaPlayer(soundController); 
      mediaController.setAnchorView(getView()); 
      mediaController.show(0); 
     } 

     private class SoundController implements MediaController.MediaPlayerControl{ 

      public void start() { 
       mediaPlayer.start(); 
       } 

       public void pause() { 
       mediaPlayer.pause(); 
       } 

       public int getDuration() { 
       return mediaPlayer.getDuration(); 
       } 

       public int getCurrentPosition() { 
       return mediaPlayer.getCurrentPosition(); 
       } 

       public void seekTo(int i) { 
       mediaPlayer.seekTo(i); 
       } 

       public boolean isPlaying() { 
       return mediaPlayer.isPlaying(); 
       } 

       public int getBufferPercentage() { 
       return 0; 
       } 

       public boolean canPause() { 
       return true; 
       } 

       public boolean canSeekBackward() { 
       return true; 
       } 

       public boolean canSeekForward() { 
       return true; 
       } 

      @Override 
      public int getAudioSessionId() { 
       // TODO Auto-generated method stub 
       return 0; 
      } 
     } 

編輯:基於 利賓的答案,我做了,但沒有成功如下: 擴展的MediaController和覆蓋觸摸事件

private class MyMediaController extends MediaController{ 

      public MyMediaController(Context context) { 
       super(context); 
       // TODO Auto-generated constructor stub 
      } 
      @Override 
      public boolean onTouchEvent(MotionEvent event) { 
       return true; 
      } 
     } 

使用擴展類

mediaController = new MyMediaController(getActivity()){ 
          @Override 
          public void hide() 
          { 

           if(mediaPlayer.isPlaying()){ 
            mediaPlayer.stop(); 
           } 
           super.hide(); 
          } 
         }; 

launchMediaController()實際上就是啓動媒體控制器。 我的問題是,爲什麼媒體控制器在用戶觸摸它幾秒後自己隱藏?有沒有解決這個問題的方法?

回答

2

當您調用show()時,您可以設置持續時間以在屏幕上顯示控制器。所以控制器會在'超時'毫秒的不活動狀態後自動隱藏。

您可以將超時設置爲0,以顯示控制器,直到顯式調用hide。

controller.show(0); 

使用0顯示控制器,直至隱藏()被調用。

如果使用show()方法沒有參數,默認的超時時間爲3秒

這裏是秀(INT超時)方法調用

Message msg = mHandler.obtainMessage(FADE_OUT); 
    if (timeout != 0) { 
     mHandler.removeMessages(FADE_OUT); 
     mHandler.sendMessageDelayed(msg, timeout); 
    } 

的一些代碼處理程序發送延遲的消息,如果超時ID不爲0,並且在處理程序中,如果消息爲FADE_OUT,則隱藏方法稱爲

編輯

MediaController代碼有bug。在onTouchEvent中設置了默認的超時時間,它將覆蓋超時0。

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    show(sDefaultTimeout); 
    return true; 
} 

您可以通過創建自定義的MediaController解決這個問題,並覆蓋的onTouchEvent

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    return true; 
} 
+0

這是我在做什麼,但它的用戶隱藏後幾秒鐘碰到了 – Noor

+0

秀參數0? 。我應該工作 – Libin

+0

我已經添加了我用來顯示媒體控制器的代碼 – Noor