65

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

着信時に一時停止機能を追加するために、着信時に変数を設定する受信機を作成しました。アクティビティは でこの変数を読み取りonPause()、音楽を一時停止してリセットします。通話が終了し、アクティビティが再開されると、 で音楽が再開されonResume()ます。

アクティビティにフォーカスがある限り、これは正常に機能します。音楽の再生中にホーム画面に戻って電話がかかってきても、電話がかかってきonPause()ません。したがって、音楽を止めたり始めたりすることはできません。

着信/発信通話を傍受し、音楽を正しく停止/開始するメディアプレーヤーを実装した人はいますか?

4

6 に答える 6

97

あなたができることがいくつかあります:

まず、 を使用して通話状態の変化をリッスンできます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);
}

詳細については、ドキュメントを参照してください

他にできることは、ブロードキャストを聞くことですandroid.intent.action.PHONE_STATE。通話に関する情報を提供する追加情報が含まれTelephonyManager.EXTRA_STATEます。こちらのドキュメントをご覧ください

android.permission.READ_PHONE_STATEどちらの場合も - パーミッションが必要になることに注意してください。

于 2011-04-10T09:53:51.320 に答える
13

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.
}
于 2012-11-01T11:50:19.913 に答える
13

放送受信機を試すことができます。

CallReceiverを拡張するクラスを作成しますBroadcastReceiver

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>
于 2012-11-05T14:00:13.263 に答える