AndroidのURLからメディアを再生するアクティビティを実装しました
着信コールが着信したときに一時停止機能を追加するために、コールの着信時に変数を設定するレシーバーを作成しました。アクティビティはこの変数を読み取り、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);
}
もう1つできることは、ブロードキャストAndroid.intent.action.PHONE_STATE
をリッスンすることです。呼び出しに関する情報を提供する追加のTelephonyManager.EXTRA_STATE
が含まれます。 こちらのドキュメントをご覧ください 。
どちらの場合もAndroid.permission.READ_PHONE_STATE
- permissionが必要になることに注意してください。
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
}
}
}
お役に立てば幸いです:-)
または-レシーバーアプリケーションを試すことができます。
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ファイルに追加して、アプリに登録します
<receiver Android:name="CallReceiver" >
<intent-filter>
<action Android:name="Android.intent.action.PHONE_STATE" >
</action>
</intent-filter>
</receiver>
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.
}
私見より良い方法は、オフドキュメントで説明されています: 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
}
}
}
};