24

電話が鳴っているときになんとかアクティビティを準備しました。ここで、電話に出るか、電話を拒否するときに、このアクティビティをキャンセルする方法を知る必要があります。電話しますEXTRA_STATE_IDLEか、それともEXTRA_STATE_OFFHOOK?

何か案は?

マニフェスト

    <receiver android:name=".IncomingBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>

IncomingBroadcastReceiver Java クラス

public class IncomingBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        // If an incoming call arrives
        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { //Did my work }
4

6 に答える 6

27

発信コールの場合、上記の答えは完全に間違っています。Android では、呼び出しが実際に応答されたかどうかを検出する方法がありません (発信呼び出しの場合)。番号をダイヤルした瞬間、off_hook状態が発生します。これは、Android プログラミングの欠点の 1 つです。

于 2014-02-16T13:18:03.917 に答える
22

あなたのonReceiveで:

PhoneStateChangeListener pscl = new PhoneStateChangeListener();
TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(pscl, PhoneStateListener.LISTEN_CALL_STATE);

別のクラス:

private class PhoneStateChangeListener extends PhoneStateListener {
    public static boolean wasRinging;
    String LOG_TAG = "PhoneListener";
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        switch(state){
            case TelephonyManager.CALL_STATE_RINGING:
                 Log.i(LOG_TAG, "RINGING");
                 wasRinging = true;
                 break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                 Log.i(LOG_TAG, "OFFHOOK");

                 if (!wasRinging) {
                     // Start your new activity
                 } else {
                     // Cancel your old activity
                 }

                 // this should be the last piece of code before the break
                 wasRinging = true;
                 break;
            case TelephonyManager.CALL_STATE_IDLE:
                 Log.i(LOG_TAG, "IDLE");
                 // this should be the last piece of code before the break
                 wasRinging = false;
                 break;
        }
    }
}

前の状態が「呼び出し中」だったかどうかを確認するコードを書くだけです。現在の状態がアイドル状態で、前の状態が呼び出し中だった場合は、通話をキャンセルしました。現在の状態がオフフックで、前の状態が呼び出し中だった場合、彼らは通話に応答しました。

于 2012-03-13T13:51:43.567 に答える
7

以下は、さまざまなシナリオで発生する状態です。

1)受信した電話に応答する

CALL_STATE_RINGING => CALL_STATE_OFFHOOK (After Answering call) => CALL_STATE_IDLE (After End call) 

2)拒否/応答しない(逃した)電話を受けた

CALL_STATE_RINGING => CALL_STATE_IDLE (After End call)  

3)電話をかける

CALL_STATE_OFFHOOK (After dialing) => CALL_STATE_IDLE (After End call) 

コード

  int prev_state=0;


  public class CustomPhoneStateListener extends PhoneStateListener {  

        private static final String TAG = "CustomPhoneStateListener";  

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

            if(incomingNumber!=null&&incomingNumber.length()>0) incoming_nr=incomingNumber;   

            switch(state){  
                case TelephonyManager.CALL_STATE_RINGING:  
                        Log.d(TAG, "CALL_STATE_RINGING");  
                        prev_state=state;  
                        break;  
                case TelephonyManager.CALL_STATE_OFFHOOK:  
                Log.d(TAG, "CALL_STATE_OFFHOOK");  
                prev_state=state;  
                break;  
                case TelephonyManager.CALL_STATE_IDLE:  
                    Log.d(TAG, "CALL_STATE_IDLE==>"+incoming_nr);  
                    NumberDatabase database=new NumberDatabase(mContext);  
                    if((prev_state==TelephonyManager.CALL_STATE_OFFHOOK)){  
                        prev_state=state;  
                        //Answered Call which is ended  
                    }  
                    if((prev_state==TelephonyManager.CALL_STATE_RINGING)){  
                        prev_state=state;  
                        //Rejected or Missed call  
                    }  
                    break;  

            }  
        }  
    }  

あなたの受信機で

onReceive(Context context, Intent intent) {  
        TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); //TelephonyManager object  
        CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener();  
        telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);          //Register our listener with TelephonyManager  

        Bundle bundle = intent.getExtras();  
        String phoneNr= bundle.getString("incoming_number");  

        mContext=context;  
 }  
于 2012-03-13T13:41:13.937 に答える
0

電話がかかってきたことを検出するために、「こんにちは」の声を検出できます。「こんにちは」の声は、通話進行頻度以外の頻度 (音声アクティビティ) です。参考までに、このデータシートの部分をご覧ください: https://www.cmlmicro.com/products/call-progress-and-voice-detector/

于 2021-06-13T18:43:38.117 に答える
0
//
public class myService extends InCallService 
{
    // Here... :)
    @Override public void onCanAddCallChanged(boolean canAddCall) 
    {
        super.onCanAddCallChanged(canAddCall);  
    }
}
于 2020-07-24T06:49:05.257 に答える