Android MediaPlayer On Stop事件或类似事件是否存在?

时间:2012-12-03 17:13:42

标签: android events callback media-player

大家好,并提前致谢(对不起我的英语),

我有几项使用多种音频功能的活动。为此,我在单例java类中有一个MediaPlayer,因此活动与该类交互,只存在一个媒体播放器。

其中一项功能是在X分钟后自动停止媒体播放器。所以我在单例类中创建了一个计时器,完全停止了无线电流。问题是没有反馈或回调正在运行的活动。有一个播放/停止按钮必须更改图像,我不知道如何捕获onStop事件或其他....或者可以从当前活动类运行的单个java类调用,所以我可以调用活动的功能,以改变图像?

最好的问候......

2 个答案:

答案 0 :(得分:1)

你可能想要使用广播接收器。

从您停止播放音乐的单曲类中,调用此方法:

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

答案 1 :(得分:1)

首先,感谢jameo的回答,听起来不错,但我不知道我是否有时间尝试,我保证如果我能在本周或下次有类似的问题,我会的。

最后我这样做了伎俩:

1 - 使用Method 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 - 我的单例类有一个MediaPlayerStopInterface接口类型的对象

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

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

4 - 我在onResume()中的活动类做了一个Singlettonclass.setStoppedPlayerInterface(this),所以我总是有一个运行活动的参考。

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的回调必须使用Handler来完成:P

完美的工作:)。但我不知道这是一个非常糟糕的做法还是不是那么可怕xD

无论如何,谢谢Jameo。你的声音更优雅:P