2012-12-03 44 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