1

READ_PHONE_STATE イベントでループを使用できますか?

電話が鳴り始めたときにループして、鳴り止むようにしたい。また、ユーザーが通話を開始して通話を切断する場合も同様です。

これは私のブロードキャストレシーバークラスです

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        while (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            //wate for user shaking the phone
            //call ansered
        }           
        while (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
            //do something while phone answered
            //I want to work something during the calling time
        }
        if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE) {
            //do some
        }
    }
}
4

2 に答える 2

0

着信コールがいつ選択/ドロップされたか、および発信コールがいつ開始/停止されたかを検出できるため、関連するコールバックに「ループ」ロジックを実装します。以下のコードにコメントを含めました。

public abstract class PhoneCallReceiver extends BroadcastReceiver {
        static CallStartEndDetector listener;



@Override
public void onReceive(Context context, Intent intent) {
    savedContext = context;
    if(listener == null){
        listener = new CallStartEndDetector();
    }


        TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
    telephony.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
}



public class CallStartEndDetector extends PhoneStateListener {
    int lastState = TelephonyManager.CALL_STATE_IDLE;
    boolean isIncoming;

    public PhonecallStartEndDetector() {}


    //Incoming call-   IDLE to RINGING when it rings, to OFFHOOK when it's answered, to IDLE when hung up
    //Outgoing call-  from IDLE to OFFHOOK when dialed out, to IDLE when hunged up

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);
        if(lastState == state){
            //No change
            return;
        }
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                isIncoming = true;
                 //incoming call started
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                //Transition of ringing->offhook are pickups of incoming calls.  Nothing down on them
                if(lastState != TelephonyManager.CALL_STATE_RINGING){
                    isIncoming = false;
                   //outgoing call started
                }
                break;
            case TelephonyManager.CALL_STATE_IDLE:
                //End of call(Idle).  The type depends on the previous state(s)
                if(lastState == TelephonyManager.CALL_STATE_RINGING){
                    // missed call
                }
                else if(isIncoming){
                      //incoming call ended
                }
                else{
                   //outgoing call ended                                              
                }
                break;
        }
        lastState = state;
    }

}

}

于 2014-07-28T14:57:11.523 に答える
0

必要な調査はすべて完了していますが、やりたいのはおそらく「ループ」ではありません。

必要なのは、電話が鳴ったら何かを開始し、鳴らなくなったら停止することです。インコールも同様。

電話が鳴っている間にイベントを処理するには、 CALL_STATE_RINGINGで何かを開始し、 CALL_STATE_OFFHOOKまたはCALL_STATE_IDLEのいずれかが鳴っているのがいつ止まるかを知るのを待ちます。

ユーザーが電話をかけている間も同じです。受信者がCALL_STATE_OFFHOOKを受信したときに何かを開始し、CALL_STATE_IDLEを受信したときに停止します。

UIスレッドでBroadcastReceiverにメッセージを送信(または関数を呼び出し)させて、必要なことを実行させ、呼び出し状態が変更されたときに通知します。

これらの間隔でループする必要はありません。適切なタイミングで何かを開始/停止したいだけです。いつでも何らかのバックアップ セキュリティを設定できます (例: 電話が鳴って 3 分間何も起こらなかった場合、私は何かをやめる)。

于 2014-07-28T12:40:40.837 に答える