2011-04-10 57 views
50

啓動音樂,我已經實施了針對Android停止與呼入

一個URL播放媒體爲了增加暫停功能的活動時,來電是進入我創建了一個接收器,設置AA變量時候調用來了。該活動讀取此變量,然後在其onPause()方法中暫停音樂,並重置當呼叫完成並且活動在其onResume()方法中恢復音樂時

只要活動具有焦點。如果我在播放音樂的同時回到主屏幕,然後來電,則活動的暫停不會被稱爲&,因此我可以'停止&開始音樂

這是什麼方法?任何人都實施了媒體播放器,以便在任何時候攔截傳入的&傳出呼叫&停止並正確啓動音樂?

回答

88

有幾件事情可以做:

首先,你可以聽的使用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的許可。

+0

我是否需要註冊我的活動中播放音樂的PhoneStateListener? 如果該活動失去了重點,該怎麼辦?聽衆會繼續工作嗎? – user669231 2011-04-10 12:20:55

+2

是的,聽衆需要在播放音樂的活動中註冊,如果活動失去焦點(只要它沒有被殺死),它就會被調用。但是,使用服務播放音樂而不是「活動」可能更合適,因爲「活動」可能會被終止。 – Kaloer 2011-04-11 07:14:00

+2

這對我有用。我創建了一個服務並在其中註冊了phonestatelistener。現在,即使我的活動失去了焦點(如用戶通過按主頁按鈕進入主屏幕),來電會被檢測到,我可以停止並開始播放音樂 – user669231 2011-04-12 18:40:09

12

我認爲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. 
} 
+0

這不會很好地處理來電。 - 他們看起來像是自動播放音頻,但來電不會觸發'onAudioFocusChange'。 – 2013-05-08 00:14:25

+2

根據文檔,這是推薦的方式:http://developer.android.com/intl/ru/guide/topics/media/mediaplayer.html – david72 2016-01-12 23:02:30

12

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> 
+2

我不喜歡那個接收器的名稱:) – 2015-04-07 22:57:17

+0

100%工作碼。非常好 – 2017-04-21 11:32:03

1

對我來說,空閒狀態是未來雖然有來電,快速修復是在廣播接收機檢查

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

我認爲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 
    } 
} 

}

我希望這有助於你:-)

+3

不僅要控制GSM來電而且還要VOIP的呼叫如Skype,Facebook消息的呼叫然後按照@mickesource解釋的方式。 – 2016-07-09 17:00:40

+1

我在音樂服務中實現這個喜歡 「公共類ServiceMusicPlayer擴展服務實現AudioManager.OnAudioFocusChangeListener」 偉大工程 謝謝! – 2016-09-19 00:58:23