停止&来电时启动音乐

时间:2011-04-10 07:58:01

标签: android android-activity media-player incoming-call

我已经实现了一个从android

中的URL播放媒体的Activity

为了在传入来电时添加暂停功能,我创建了一个接收器,用于在呼叫到来时设置变量。活动读取此变量,然后在其onPause()方法中暂停音乐,并且重置是在完成调用并且活动在其onResume()方法中恢复音乐时

只要活动具有焦点,这就可以正常工作。如果我在播放音乐时返回主屏幕,然后呼叫到来,则不会调用活动的暂停状态。因此,我可以'停止&开始音乐

这是什么出路?任何人都实施了一个媒体播放器,以便拦截传入和播放器。随时拨打电话&停止并正确启动音乐?

7 个答案:

答案 0 :(得分:91)

您可以做一些事情:

首先,您可以使用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);
}

For more information read the documentation

您可以做的另一件事是收听广播android.intent.action.PHONE_STATE。它将包含额外的TelephonyManager.EXTRA_STATE,它将为您提供有关通话的信息​​。 Take a look at the documentation here

请注意,在这两种情况下,您都需要android.permission.READ_PHONE_STATE - 权限。

答案 1 :(得分:48)

我认为AudioManager是最好,最快的解决方案。这里有我的实​​现示例:

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
    }
}   

}

我希望它对你有帮助: - )

答案 2 :(得分:13)

或 - 您可以尝试接收器应用程序。

创建名为 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>

答案 3 :(得分:12)

我认为requestAudioFocus()应该能够自动处理这种情况。您无需明确检查呼叫状态。

Audio Focus本质上是合作的。也就是说,预期(并且极力鼓励)应用程序遵守音频焦点指南,但系统不会强制执行这些规则。如果应用程序想要在失去音频焦点后播放嘈杂的音乐,系统中的任何内容都不会阻止它。但是,用户更有可能遇到糟糕的体验,并且更有可能卸载行为不当的应用程序。

要请求音频焦点,您必须从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.
}

答案 4 :(得分:5)

恕我直言的更好方法在关闭文档中进行了描述:http://developer.android.com/training/managing-audio/audio-focus.html

答案 5 :(得分:2)

对于我来说,当有来电时,空闲状态即将到来,快速解决方法是检查广播接收器

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

答案 6 :(得分:0)

基于mickesource,已针对Android Oreo +和kotlin更新。我添加了服务,可以针对活动或片段进行跟踪。

class MusicService : Service(), AudioManager.OnAudioFocusChangeListener {

var audioManager: AudioManager? = null
var audioFocusRequest:AudioFocusRequest?=null


override fun onCreate() {
    super.onCreate()    
    setAudioFocusChangeListener()
}


private fun setAudioFocusChangeListener() {

    audioManager = getSystemService(AUDIO_SERVICE) as AudioManager?

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        audioFocusRequest=AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
            .setAudioAttributes(
                AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build()
            )
            .setAcceptsDelayedFocusGain(true)
            .setOnAudioFocusChangeListener(this).build()
        audioManager?.requestAudioFocus(audioFocusRequest!!)
    } else {
        @Suppress("deprecation")
        audioManager?.requestAudioFocus(
            this,
            AudioManager.STREAM_MUSIC,
            AudioManager.AUDIOFOCUS_GAIN
        )
    }
}

override fun onAudioFocusChange(focusChange: Int) {
    if(focusChange<=0){
        //Pause audio
    }else{
        //Play audio
    }
}

 

已在Android 10上针对常规调用和应用调用进行了测试