在来电时停止和启动音乐
我已经实现了一个活动,从Android中的URL播放媒体
为了增加暂停function,当来电是传入时,我创build了一个接收器,设置一个variables,当来电。 该活动读取此variables,然后在其onPause()方法中暂停音乐,并重置当呼叫完成时,活动在其onResume()方法中恢复音乐
这项工作很好,只要活动有重点。 如果我在播放音乐的同时回到主屏幕,然后来电,则不会调用活动的暂停,因此我可以“停止并启动音乐”
这是什么出路? 任何人都实现了媒体播放器,以便在任何时候拦截来电和拨出电话,并正确地停止和启动音乐?
有几件事你可以做:
首先,您可以使用PhoneStateListener
呼叫状态的PhoneStateListener
。 您可以在TelephonyManager中注册监听器:
PhoneStateListener phoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { if (state == TelephonyManager.CALL_STATE_RINGING) { //Incoming call: Pause music } else if(state == TelephonyManager.CALL_STATE_IDLE) { //Not in call: Play music } else if(state == TelephonyManager.CALL_STATE_OFFHOOK) { //A call is dialing, active or on hold } super.onCallStateChanged(state, incomingNumber); } }; TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); if(mgr != null) { mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); }
请记住在使用PhoneStateListener.LISTEN_NONE
不再需要注销侦听器时:
TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); if(mgr != null) { mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); }
有关更多信息,请阅读文档 。
你可以做的另一件事是听广播android.intent.action.PHONE_STATE
。 它将包含额外的TelephonyManager.EXTRA_STATE
,它将为您提供有关该呼叫的信息。 看看这里的文档 。
请注意,在这两种情况下,您都需要android.permission.READ_PHONE_STATE
权限。
我认为AudioManager是最好的和快速的解决scheme。 这里有我的实现示例:
public class MyActivity extends Activity implements OnAudioFocusChangeListener { private AudioManager mAudioManager; @Override public void onCreate(Bundle savedInstanceState) { ... mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mAudioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); ... } @Override public void onDestroy(){ super.onDestroy(); ... mAudioManager.abandonAudioFocus(this); ... } @Override public void onAudioFocusChange(int focusChange) { if(focusChange<=0) { //LOSS -> PAUSE } else { //GAIN -> PLAY } }
}
我希望这对你有所帮助:-)
我想requestAudioFocus()应该能够自动处理这种情况。 您不需要明确检查呼叫状态。
audio焦点本质上是合作的。 也就是说,应用程序预计(并高度鼓励)符合audio重点指导方针,但规则不是由系统强制执行。 如果应用程序想要在失去audio焦点之后播放大声的音乐,则系统中的任何内容都不会阻止该声音。 但是,用户更可能有一个不好的经验,并将更有可能卸载行为不当的应用程序。
要请求audio焦点,您必须从AudioManager调用requestAudioFocus(),如下例所示:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // could not get audio focus. }
或者 – 您可以尝试接收器应用程序。
创build一个名为CallRecord.java的接收器
package com.example.callreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; public class CallReceiver extends BroadcastReceiver{ TelephonyManager telManager; Context context; @Override public void onReceive(Context context, Intent intent) { this.context=context; telManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); telManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE); } private final PhoneStateListener phoneListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { try { switch (state) { case TelephonyManager.CALL_STATE_RINGING: { //PAUSE break; } case TelephonyManager.CALL_STATE_OFFHOOK: { break; } case TelephonyManager.CALL_STATE_IDLE: { //PLAY break; } default: { } } } catch (Exception ex) { } } }; }
然后将这行添加到manifest.xml文件中,将其注册到App上
<receiver android:name="CallReceiver" > <intent-filter> <action android:name="android.intent.action.PHONE_STATE" > </action> </intent-filter> </receiver>
恕我直言更好的方式是在文档中描述: http : //developer.android.com/training/managing-audio/audio-focus.html
有来电时,空闲状态即将到来,快速解决办法是检查广播接收机
BroadcastReceiver phonestatereceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); if (extras != null) { String state = extras.getString(TelephonyManager.EXTRA_STATE); if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { //pause here } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { //pause here } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { //play here } } } };