4

このOnReceive方法では、次のようなものがあります。

    Bundle bundle=intent.getExtras();
   String phonenumber=intent.getStrngExtra(Intent.EXTRA_PHONE_NUMBER);

ダイヤル通話がまだオンになっている場合、またはクライアントが通話を切った場合、どのように確認しますか?通話に応答したかどうかを確認するにはどうすればよいですか?

クライアントが電話を切ったとき、または呼び出されたクライアントが電話に応答したときに、トートを印刷する必要があります。

4

3 に答える 3

2

さて、これに対する解決策を見つけて、それをうまく実装しました。呼び出し先が発信呼び出しを受け入れた正確な時間を取得することはできません。

on_State_idle相手側でコールに応答する前に、コールはすでにとの 2 つの段階を通過していon_state_offhookます。On_state_ringing発信コールに対して機能していません。

相手側の人が電話に出なかった場合、電話が 40 秒間 (これは確かではありません) 鳴り続けると仮定しましょう。

  1. と の開始段階に合わせてタイマーを開始しon_State_idleますon_state_offhook

  2. タイマーが 40 秒を超えた場合の 2 つのケースは、相手が私のコールを選択したことを意味します。

  3. 40 秒以内に動作した場合on_State_idle->on_state_offhook->on_State_idleは、もう一方の手が私のコールを選択しなかったことを意味します。

  4. 2 番目のケースが true の場合、通話ログから通話の通話時間を取得します。

  5. Totaltimer running time - 通話ログの時間により、発信通話の正確な時間がわかります!

于 2013-12-17T10:48:11.190 に答える
2

アクションandroid.intent.action.PHONE_STATEに登録されたブロードキャスト レシーバーが必要になります。

オフフックになっても電話の状態がアイドル状態に変わらない場合は、通話がまだ続いていることを意味します。

read phone state ブロードキャスト レシーバーの状態が offhook に変化した場合 、コールは応答されました。これらの状態で、必要に応じて乾杯します。

   public class CallDurationReceiver extends BroadcastReceiver {

static boolean flag =false;
static long start_time,end_time;    
@Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if(action.equalsIgnoreCase("android.intent.action.PHONE_STATE")){
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                                TelephonyManager.EXTRA_STATE_RINGING)) {

               //tOAST FOR INCOMING CALL, NOT YET PICKED UP

            }         
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                    TelephonyManager.EXTRA_STATE_IDLE)) {
                end_time=System.currentTimeMillis();
 //Total time talked =
                long total_time = end_time-start_time;
                //Store total_time somewhere or pass it to an Activity using intent

}     if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                    TelephonyManager.EXTRA_STATE_OFFHOOK)) {
                 start_time=System.currentTimeMillis();

}    

    }   
    }

次のように、受信者をマニフェスト ファイルに登録します。

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

uses パーミッションも追加します。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
于 2012-04-18T16:30:28.460 に答える
0

呼び出し状態を処理するために以下のコードを使用できます:::

    private Runnable callMonitor = new Runnable() {
        public void run() {
            try {
                EndCallListener callListener = new EndCallListener();
                TelephonyManager mTM = (TelephonyManager)m_activity.getSystemService(Context.TELEPHONY_SERVICE);
                mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);
            } catch(Exception e) {
                Log.e("callMonitor", "Exception: "+e.toString());
            }
        }
    };   

    private class EndCallListener extends PhoneStateListener {
        private boolean active = false;
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {

            if(TelephonyManager.CALL_STATE_RINGING == state) {
                Log.i("EndCallListener", "RINGING, number: " + incomingNumber);
            }
            if(TelephonyManager.CALL_STATE_OFFHOOK == state) {
                //wait for phone to go offhook (probably set a boolean flag) so you know your app initiated the call.
                active = true;
                Log.i("EndCallListener", "OFFHOOK");
            }
            if(TelephonyManager.CALL_STATE_IDLE == state) {
                //when this state occurs, and your flag is set, restart your app
                Log.i("EndCallListener", "IDLE");
                if (active) {
                    active = false;

                    // stop listening                   
                    TelephonyManager mTM = (TelephonyManager)m_activity.getSystemService(Context.TELEPHONY_SERVICE);
                    mTM.listen(this, PhoneStateListener.LISTEN_NONE);

                    // restart the inbox activity
//                  Intent intent = new Intent(m_activity, MDInboxActivity.class);
//                  m_activity.startActivity(intent);
                }
            }
        }
    }
于 2012-04-18T16:31:54.557 に答える