web-dev-qa-db-ja.com

着信通話の音楽の停止と開始

AndroidのURLからメディアを再生するアクティビティを実装しました

着信コールが着信したときに一時停止機能を追加するために、コールの着信時に変数を設定するレシーバーを作成しました。アクティビティはこの変数を読み取り、onPause()メソッドで音楽を一時停止し、呼び出しが完了するとリセットされ、onResume()メソッドで音楽が再開されます。

これは、アクティビティにフォーカスがある限り正常に機能します。音楽の再生中にホーム画面に戻ってから電話がかかってくると、アクティビティの一時停止が呼び出されないため、音楽を停止して開始することができます

これのための出口は何ですか?誰でもメディアプレーヤーを実装して、着信と発信を常に傍受し、音楽を正しく停止および開始できるようにしましたか?

54
user669231

できることがいくつかあります。

まず、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が必要になることに注意してください。

91
Kaloer

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

}

お役に立てば幸いです:-)

49
mickesource

または-レシーバーアプリケーションを試すことができます。

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>
13
kulakesh

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.
}
12
Shiv

私見より良い方法は、オフドキュメントで説明されています: http://developer.Android.com/training/managing-audio/audio-focus.html

5
Anton Balashov

私にとっては、着信コールがあったときにアイドル状態が発生していました、簡単な修正はブロードキャストレシーバーをチェックインすることです

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