2012-12-03 82 views
0

大家好,並提前感謝(並對不起,我的英語),Android MediaPlayer停止事件或類似事件是否存在?

我有幾個使用多個音頻功能的活動。爲此,我有一個MediaPlayer在單人Java類中,所以活動與該類交互,並且只存在一個媒體播放器。

其中一個功能是在X分鐘後自動停止mediaplayer。所以我在單身人士課程中創建了一個計時器,並完美地停止了無線電流。問題是沒有任何反饋或回調正在運行的活動。有一個播放/停止按鈕,必須改變圖像,我不知道如何捕獲onStop事件或任何....或可以從單個java類調用當前活動類運行,所以我可以調用活動的功能,以改變圖像?

最好的問候...

回答

1

你可能想用這個廣播接收器。

從你singlton類不停止,當你的計時器停止音樂,調用這個方法:

public void broadcastMusicPaused(View v){ 
    Intent broadcast = new Intent(); 
    broadcast.setAction("MUSIC_STOPPED"); 
    sendBroadcast(broadcast); 
} 

然後,從控制活動,建立你的接收機是這樣的:

private BroadcastReceiver receiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     Toast.makeText(getApplicationContext(), "Music Paused", Toast.LENGTH_SHORT).show(); 
     displayMusicStopped();  //switches images 
    } 
}; 

@Override 
protected void onResume() { 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction("MUSIC_STOPPED"); 
    registerReceiver(receiver, filter); 

    super.onResume(); 
} 

@Override 
protected void onPause() { 
    unregisterReceiver(receiver); 
    super.onPause(); 
} 
+0

是的,這聽起來非常好,如果我有時間我會嘗試,但我必須在這幾天內解決一些大問題:( 但是,代碼聽起來像我期待的,但我做了其他方法 – Rako

1

首先,感謝jameo對他的回答,聽起來不錯,但我不知道我是否有時間嘗試,我保證如果我可以在本週或下一次我有類似的問題。

最後我做的訣竅是這樣的:

1 - 創建方法onStopMediaPlayer一個接口(); //例如調用MediaPlayerStopInterface

public interface MediaPlayerStopInterface { 
    /** 
    * Called when the player timer ends 
    */ 
    public void onStopMediaPlayer(); 
} 

2 - 我的活動類實現了界面切換圖像。

public class PortadaActivity extends Activity implements MediaPlayerStopInterface{ 
    public void onStopMediaPlayer(){ 
     //Switch images or whatever 
    } 
} 

3 - 我singletton類具有接口MediaPlayerStopInterface

public class AudioControllerClass { //The Singletton Java Class 
    private MediaPlayerStopInterface currentActivity; 

    public void setCurrentActivity(MediaPlayerStopInterface mpsi){ 
    currentActivity=mpsi; 
} 
} 

4的類型的對象 - 在我的onResume活動類()做一個Singlettonclass.setStoppedPlayerInterface(本),所以總是有一個運行活動的參考。

public class PortadaActivity extends Activity implements MediaPlayerStopInterface{ 
    public void onResume() { 
     AudioControllerClass.getInstance(getApplicationContext()).setCurrentActivity(this); //In every resume the singletton class knows who was the last one in being active 
    } 
} 

5 - 當定時器執行,因爲我有活動中的類引用,只需要調用object_StoppedPlayerInterface.stoppedPlayer();

public class AudioControllerClass { //The Singletton Java Class 
    class TimerRadio extends TimerTask { 
     public void run() { 
      if(whatever==true){ 
       currentActivity.onStopMediaPlayer(); 
      } 
     } 
    } 
} 

最後,我沒有代碼,但回調onStopMediaplayer活動必須與處理程序來完成,如果你不希望有一個「只有UI線程可以觸摸他的看法」的異常:P

它完美的作品:)。但我不知道這是一個非常糟糕的做法還是不是很可怕xD

無論如何謝謝Jameo。你的聽起來更優雅:P

+0

發表了幾段實際代碼片段,我會提出你的答案!聽起來像它可以幫助別人! – Jameo

+0

完成,這就是除了處理程序部分的所有代碼...我希望它可以可以理解:) 這很好,但可能你的解決方案更優雅/高效 – Rako

+0

你使用了一個回調接口......這可能在技術上較少的開銷,在多個地方只有更多的代碼行。廣播接收器非常靈活且功能強大,所以下次需要在流程間進行通信時,請嘗試一下! – Jameo