0

重複の可能性:
着信時に音楽を停止および開始する

MediaPlayerクラスを使用してオーディオを再生する単純なアプリケーションがあります。アプリケーションをデバッグしているときに、着信と発信の通話中にオーディオが引き続き再生されることがわかりました。

私の問題の解決策はphoneStateListenerを使用することであることがわかりました。しかし、私はこれを行う方法を完全には理解していません。BroadcastReceiverとPhoneStateListenerを使用した例をいくつか見ましたが、BroadCastReceiverが必要な理由がわかりませんでした。

誰かがPho​​neStateListenerのサンプル実装を提供してくれれば幸いです。MediaPlayerオブジェクトはアプリケーション全体でグローバルであるため、電話の状態を取得できれば、オーディオを一時停止または再開できます。

4

1 に答える 1

1

これが私が使用しているものです...onCallStateChanged()呼び出し状態が変更されると、すべてのPhoneStateListenersで関数が呼び出されるため、これを処理する必要があります。

import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

//Makes sure the audio is paused for incoming/outgoing phone calls
public class ListenToPhoneState extends PhoneStateListener {

    private boolean pausedForPhoneCall = false;
    private UIManager uiManager;

    ListenToPhoneState(UIManager manager){
        uiManager = manager;
    }

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {

        switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                resumeInAndroid();
                return;
            case TelephonyManager.CALL_STATE_OFFHOOK: 
                pauseInAndroid();               
                return;
            case TelephonyManager.CALL_STATE_RINGING: 
                pauseInAndroid();               
                return;
        }
    }

    private void resumeInAndroid(){
        if(pausedForPhoneCall == true) {
            pausedForPhoneCall=false;
            uiManager.waitForPhoneCall(false);
        }
    }

    private void pauseInAndroid(){
        if(pausedForPhoneCall == false){
            pausedForPhoneCall=true;
            uiManager.waitForPhoneCall(true);
        }
    }

    String stateName(int state) {
        switch (state) {
            case TelephonyManager.CALL_STATE_IDLE: return "Idle";
            case TelephonyManager.CALL_STATE_OFFHOOK: return "Off hook";
            case TelephonyManager.CALL_STATE_RINGING: return "Ringing";
        }
        return Integer.toString(state);
    }
}

これを現在のアクティビティに追加する場合は、これを実行します。

ListenToPhoneState listener = new ListenToPhoneState(userInterface);
        TelephonyManager tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        if(tManager != null)
            tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);

現在の活動を一時停止してみませんか?クラスに現在のアクティビティのインスタンスを渡す場合、本当に必要な場合は、finish()を呼び出して、switchステートメントで新しいアクティビティを作成できます。

于 2012-06-20T15:22:50.323 に答える