从android中的通话记录中删除已接听来电

时间:2012-09-12 06:54:38

标签: android

我正在使用广播接收器接收phone_states并检查任何呼叫(出/出)正在将状态更改为EXTRA_STATE_IDLE,然后从呼叫记录中删除呼叫信息。 据我所知,android手机的状态是:

  1. EXTRA_STATE_RINGING
  2. EXTRA_STATE_OFFHOOK
  3. EXTRA_STATE_IDLE
  4. 这是我知道的来电:

    1. 收到来电时 - > EXTRA_STATE_RINGING => EXTRA_STATE_OFFHOOK(接听电话后)=> EXTRA_STATE_IDLE(结束通话后)
    2. 当来电被切断时 - > EXTRA_STATE_RINGING => EXTRA_STATE_IDLE(结束通话后)
    3. 所以,当电话状态在EXTRA_STATE_IDLE时,实际上我正在清除通话记录历史记录。但是在这个策略中,我能够清除2.场景的日志历史,但不能用于1.场景。

      这是我的代码::

      String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
      
      if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)){              
                    Toast.makeText(context, "ringing", 20).show();
      
                    SharedPreferences statePreference=context.getApplicationContext().getSharedPreferences("RingCallState", 0);
                    SharedPreferences.Editor editor=statePreference.edit();
                    editor.putBoolean("State", true);
                    editor.commit();
      
                    context.startActivity(i);
                }
      
                else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
      
                    Toast.makeText(context, "off hook", 20).show();
      
                    SharedPreferences statePreference=context.getApplicationContext().getSharedPreferences("RingCallState", 0);
      
                    Log.d("statePref OFFHOOK", "state :: "+statePreference.getBoolean("State", false));
      
                    if(!statePreference.getBoolean("State", false)) {
      
                        SharedPreferences out_statePreference=context.getApplicationContext().getSharedPreferences("OutCallState", 0);
                        SharedPreferences.Editor out_editor=out_statePreference.edit();
                        out_editor.putBoolean("OutState", true);
                        out_editor.commit();
      
                    }                 
                }
      
                else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
                    Toast.makeText(context, "idle", 20).show();
      
                    SharedPreferences statePreference=context.getApplicationContext().getSharedPreferences("RingCallState", 0);
      
                    Log.d("statePref IDLE", "state :: "+statePreference.getBoolean("State", false));
      
                    if(statePreference.getBoolean("State", false))
                      {                       
                          SharedPreferences.Editor editor=statePreference.edit();
                          editor.putBoolean("State", false);
                          editor.commit();
      
                          Log.d("in", "in coming :: "+incomingNumber);
      
                          new Handler().postDelayed(new Runnable() {
                                public void run() {
                                    clearLastCallLog(context, incomingNumber);
                                }
                            }, 4000);
      
                      }
      
      
                      SharedPreferences out_statePreference=context.getApplicationContext().getSharedPreferences("OutCallState", 0);
                      if(out_statePreference.getBoolean("OutState", false))
                      {
                          SharedPreferences.Editor out_editor=out_statePreference.edit();
                          out_editor.putBoolean("OutState", false);
                          out_editor.commit();
      
                          Log.d("out", "out going :: "+outgoingNumber);
      
                          new Handler().postDelayed(new Runnable() {
                                public void run() {
                                    clearLastCallLog(context, outgoingNumber);
                                }
                            }, 4000);
                      }
      
                }
      

      我错过了什么......任何人都可以解释是否有任何事情可以处理接听来电? 有任何建议请...

3 个答案:

答案 0 :(得分:0)

一旦呼叫振铃,你可以将状态(int值)维持为呼叫状态(RINGING)使其成为1,如果呼叫被应答(OFFHOOK)使其成为2,如果呼叫结束(IDLE)使其成为现在,只要其中任何一个案例触发检查最后一个呼叫状态,这样就可以轻松跟踪你的2个场景。请记住,一旦任何呼叫结束并且您已完成,请将呼叫状态重置为0。

答案 1 :(得分:0)

这是一种黑客行为,我以前没试过,但你可以尝试一下。

让我们拿变量:

boolean isIdle=true;
boolean isOffhook=false;

现在,当你进入手机处于“摘机状态”的情况时:

有:

if(isIdle==true)
    isIdle=false;

isOffhook=true;

现在,手机状态为“空闲”:

在开头添加这些代码:

if(isIdle==false && isOffhook==true){
    // case :there has been a call
    String lastCall=<get the type of call of last call,from call log of phone>; //incoming or outgoing

    if(lastCall=="incoming"){
       // last call was answered incoming call
    }
    isOffhook=false;
}
isIdle=true;

答案 2 :(得分:0)

解决了它。虽然已经晚了,但它可以帮到任何人。问题是,每次更改手机状态时都会调用BroadcastReceiver onReceive(Context context, Intent intent),但意图会为EXTRA_STATE_RINGINGEXTRA_STATE_IDLE but not for EXTRA_STATE_OFFHOOK提供传入号码。因此,当收到呼叫时,来电号码变为空。