啓動音樂,我已經實施了針對Android停止與呼入
一個URL播放媒體爲了增加暫停功能的活動時,來電是進入我創建了一個接收器,設置AA變量時候調用來了。該活動讀取此變量,然後在其onPause()方法中暫停音樂,並重置當呼叫完成並且活動在其onResume()方法中恢復音樂時
只要活動具有焦點。如果我在播放音樂的同時回到主屏幕,然後來電,則活動的暫停不會被稱爲&,因此我可以'停止&開始音樂
這是什麼方法?任何人都實施了媒體播放器,以便在任何時候攔截傳入的&傳出呼叫&停止並正確啓動音樂?
啓動音樂,我已經實施了針對Android停止與呼入
一個URL播放媒體爲了增加暫停功能的活動時,來電是進入我創建了一個接收器,設置AA變量時候調用來了。該活動讀取此變量,然後在其onPause()方法中暫停音樂,並重置當呼叫完成並且活動在其onResume()方法中恢復音樂時
只要活動具有焦點。如果我在播放音樂的同時回到主屏幕,然後來電,則活動的暫停不會被稱爲&,因此我可以'停止&開始音樂
這是什麼方法?任何人都實施了媒體播放器,以便在任何時候攔截傳入的&傳出呼叫&停止並正確啓動音樂?
有幾件事情可以做:
首先,你可以聽的使用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
的許可。
我認爲requestAudioFocus()應該能夠自動處理這種情況。您不需要明確檢查呼叫狀態。
音頻焦點本質上是合作的。也就是說,應用程序預計(並高度鼓勵)符合音頻重點指導原則,但規則不會由系統強制執行。如果應用程序想要在失去音頻焦點後播放嘈雜的音樂,系統中的任何內容都不會阻止該音樂。但是,用戶更可能有不愉快的體驗,並且更有可能會卸載行爲不當的應用程序。
請求音頻焦點,您必須調用從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.
}
這不會很好地處理來電。 - 他們看起來像是自動播放音頻,但來電不會觸發'onAudioFocusChange'。 – 2013-05-08 00:14:25
根據文檔,這是推薦的方式:http://developer.android.com/intl/ru/guide/topics/media/mediaplayer.html – david72 2016-01-12 23:02:30
OR - 您可以嘗試的接收器中的應用。
創建一個名爲接收機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) {
}
}
};
}
然後在清單加入這一行。XML文件註冊它在App
<receiver android:name="CallReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" >
</action>
</intent-filter>
</receiver>
我不喜歡那個接收器的名稱:) – 2015-04-07 22:57:17
100%工作碼。非常好 – 2017-04-21 11:32:03
對我來說,空閒狀態是未來雖然有來電,快速修復是在廣播接收機檢查
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
}
}
}
};
我認爲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
}
}
}
我希望這有助於你:-)
不僅要控制GSM來電而且還要VOIP的呼叫如Skype,Facebook消息的呼叫然後按照@mickesource解釋的方式。 – 2016-07-09 17:00:40
我在音樂服務中實現這個喜歡 「公共類ServiceMusicPlayer擴展服務實現AudioManager.OnAudioFocusChangeListener」 偉大工程 謝謝! – 2016-09-19 00:58:23
恕我直言,更好的辦法是關機文檔描述:http://developer.android.com/training/managing-audio/audio-focus.html
我是否需要註冊我的活動中播放音樂的PhoneStateListener? 如果該活動失去了重點,該怎麼辦?聽衆會繼續工作嗎? – user669231 2011-04-10 12:20:55
是的,聽衆需要在播放音樂的活動中註冊,如果活動失去焦點(只要它沒有被殺死),它就會被調用。但是,使用服務播放音樂而不是「活動」可能更合適,因爲「活動」可能會被終止。 – Kaloer 2011-04-11 07:14:00
這對我有用。我創建了一個服務並在其中註冊了phonestatelistener。現在,即使我的活動失去了焦點(如用戶通過按主頁按鈕進入主屏幕),來電會被檢測到,我可以停止並開始播放音樂 – user669231 2011-04-12 18:40:09