【问题标题】:Android - In the event of outgoing calls, are being throws automatically the state of OFF_HOOKAndroid - 在拨出电话的情况下,会自动抛出 OFF_HOOK 状态
【发布时间】:2013-01-15 14:42:24
【问题描述】:

在拨出电话的情况下,正在自动抛出 OFF HOOK 状态 大家好,首先我为我的英语道歉。

嗯,在我的应用程序中,我会监控每次通话之前和之后。但是就在通话开始之后,所以我对“响铃”状态无关紧要,但是我的应用程序正在触发一个假的“摘机”状态。当我拨打电话(拨出电话)时,我的应用程序在振铃后立即设置摘机状态。有了这个,我正在监视一个我不应该接听的电话,因为该电话无法接听。

有人遇到过这个问题吗?

AndroidManifest.xml

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

    <receiver
        android:name=".OutgoingCallBroadcastReceiver">
        <intent-filter>
          <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>
    </receiver>

CallStateBroadcastReceiver:

    CallStatePhoneStateListener phoneListener = new CallStatePhoneStateListener(context, intent);
    TelephonyManager telephony = (TelephonyManager) context.getSystemService(
            Context.TELEPHONY_SERVICE);

        telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);

CallStatePhoneStateListener:

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

    switch (state) {
        case TelephonyManager.CALL_STATE_IDLE:

            // do something
            break;

        case TelephonyManager.CALL_STATE_OFFHOOK:

            // do something
            break;

        case TelephonyManager.CALL_STATE_RINGING:

            // do something
            break;
}

OutgoingCallBroadcastReceiver:

@Override
public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();
    if (bundle == null)
        return;

    String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
    // just save the number
}

【问题讨论】:

  • 对不起,这是我的错误。当然,如果我打电话,我的电话会挂机,如果另一个人不接听也是一样。但是现在我有另一个疑问,我怎么知道我的拨出电话是否被接听?谢谢!

标签: android call state phone-state-listener


【解决方案1】:

获取一个静态字符串,例如:- prev_state 并在每种情况下将电话的状态存储在该字符串中 例如,如果你想知道拨出电话是如何断开的,那么应该这样做,

   if(state==TelephonyManager.CALL_STATE_IDLE)
{ Log.d(TAG, "CALL_STATE_IDLE==>"+incoming_nr);
                      {
                   if((prev_state==TelephonyManager.CALL_STATE_OFFHOOK))
                             {  
                        prev_state=state;  
                       // do something when the Call  is ended 
                              }
                       }
}

希望对你有帮助:)

【讨论】:

  • 谢谢,但这不起作用,因为呼出状态不会引发振铃状态。直接进入摘机状态,在这种情况下这是正确的。
  • @William Lopes 如果你有解决方案,那么没关系,但如果你还没有,那么在 android 中搜索 ITelephony
【解决方案2】:

我希望这对你有用。

public void onCallStateChanged(int state, String incomingNumber) {
    super.onCallStateChanged(state, incomingNumber);

    Log.d("main", "incoming call receiver.");
    PowerManager pm = (PowerManager) c
            .getSystemService(Context.POWER_SERVICE);
    boolean isScreenOn = pm.isScreenOn();

    switch (state) {
    case TelephonyManager.CALL_STATE_IDLE:
        Log.v("idle state", "CALL_STATE_IDLE");
        // CALL_STATE_IDLE;


        if (ring == true && callReceived == false && CheckMissCall.isReject==true) {

            Log.v("missed call", "Missed call from : " + incomingNumber);
            if(CheckMissCall.isShown)
            {
                c.stopService(new Intent(c, Unlock_hud.class));

            }

            flag = true;
            if (prefs.getBoolean("main_state", true) )
            {
                Intent inter = new Intent(c, MissCall.class);
                inter.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                inter.putExtra("CellNumber", incomingNumber);
                c.startActivity(inter);
            }

        }


        break;
    case TelephonyManager.CALL_STATE_OFFHOOK:
        // CALL_STATE_OFFHOOK;
        callReceived = true;
        Log.v("call received", "CALL_STATE_OFFHOOK  " + incomingNumber);        

        break;
    case TelephonyManager.CALL_STATE_RINGING:
        ring = true;
        // CALL_STATE_RINGING
        Log.v("call ringing", "CALL_STATE_RINGING  " + incomingNumber);
        Log.d("flags", "flags: " + flag);
        if (flag) {

            //cut = true;
            //flag = false;
            CheckMissCall call = new CheckMissCall(c);
            call.setName(incomingNumber);
            call.setNumber4Sms(incomingNumber);
            call.setContactPhoto();

            Log.d("main", "state ringing");
            prefs = PreferenceManager.getDefaultSharedPreferences(c);

            if (!prefs.getBoolean("main_state", false)) {

                return;
            }       

            if (CheckMissCall.isRunning) {

                return;
            }
            else {
                Log.d("main", "EEEEEEEEEEEEEEEE:  Unlock hud");
                Intent in = new Intent(c, Unlock_hud.class);
                in.setFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
                c.startService(in);

                // c.stopService(new Intent(c, Unlock_hud.class));
            }
        }
        break;

【讨论】:

  • 谢谢你,你的想法给了我另一个想法。哈哈哈你的想法是接听电话,我的问题是拨出电话。
  • 哦..老板...快乐编码
猜你喜欢
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多