【问题标题】:Delete call from call log after call end通话结束后从通话记录中删除通话
【发布时间】:2011-03-19 10:08:20
【问题描述】:

我是 Android 开发新手。我想拨打一个号码,但我不想将号码存储在我的通话记录中。通话结束后如何从通话记录中删除号码?

【问题讨论】:

  • 请选择您的答案。

标签: android calling-convention


【解决方案1】:

首先您必须设置一个广播接收器来检测手机状态。这是完全相同的问题:Stackoverflow - Intent to be fired when a call ends?

现在要删除通话记录条目,这是 google 上的第一个链接:Call log deletion in Android
在示例中,他删除了特定号码的所有通话条目,但您可以更改查询以删除特定通话记录 ID 的条目。

希望这会有所帮助。 干杯

【讨论】:

    【解决方案2】:

    无论如何我都在使用 4.2.2,我不得不修改 aftab 的代码,因为它不适合我。这可能是一个异步问题,因为我试图做的是在来电结束后立即更新通话记录。我认为在删除条目之前我必须给 O/S 足够的时间来更新表格,否则它将不存在:

    private void deleteNumber(String phoneNumber) {
    
        try {
            Thread.sleep(4000);
            String strNumberOne[] = { phoneNumber };
            Cursor cursor = context.getContentResolver().query(
                    CallLog.Calls.CONTENT_URI, null,
                    CallLog.Calls.NUMBER + " = ? ", strNumberOne, "");
            boolean bol = cursor.moveToFirst();
            if (bol) {
                do {
                    int idOfRowToDelete = cursor.getInt(cursor
                            .getColumnIndex(CallLog.Calls._ID));
                    context.getContentResolver().delete(
                            CallLog.Calls.CONTENT_URI,
                            CallLog.Calls._ID + "= ? ",
                            new String[] { String.valueOf(idOfRowToDelete) });
                } while (cursor.moveToNext());
            }
        } catch (Exception ex) {
            Log.v("deleteNumber",
                    "Exception, unable to remove # from call log: "
                            + ex.toString());
        }
    }
    

    并调用我在另一个线程上运行的函数(因为我正在睡觉):

      new Thread() {
     public void run() {
    deleteNumber(incomingNumber);
        }
    }.start();
    

    添加睡眠后,在通话结束后尝试删除时似乎可以正常工作。

    更新:在最后一条评论意识到我们可以在 android 提供者调用日志 uri 上设置一个 contentobserver:

    public class BlockerContentObserver extends ContentObserver{
    
    private Context context;
    private String phoneNumber;
    
    
    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
    
    public BlockerContentObserver(Handler handler,Context context) {
        super(handler);
    this.context=context;
    }
    
     @Override
        public boolean deliverSelfNotifications() {
            return true;
        }
    
    @Override
    public void onChange(boolean selfChange) {
        // TODO Auto-generated method stub
        super.onChange(selfChange);
        Log.v(Consts.TAG,"has call log changed:"+selfChange);
        deleteNumber(phoneNumber);
    
    }   
    
    private void deleteNumber(String phoneNumber) {
    
    
        try {
    
            String strNumberOne[] = { phoneNumber };
            Cursor cursor = context.getContentResolver().query(
                    CallLog.Calls.CONTENT_URI, null,
                    CallLog.Calls.NUMBER + " = ? ", strNumberOne, "");
            boolean bol = cursor.moveToFirst();
            if (bol) {
                do {
                    int idOfRowToDelete = cursor.getInt(cursor
                            .getColumnIndex(CallLog.Calls._ID));
                    context.getContentResolver().delete(
                            CallLog.Calls.CONTENT_URI,
                            CallLog.Calls._ID + "= ? ",
                            new String[] { String.valueOf(idOfRowToDelete) });
                } while (cursor.moveToNext());
            }
        } catch (Exception ex) {
            Log.v(Consts.TAG,
                    "Exception, unable to remove # from call log: "
                            + ex.toString());
        }
    }
    

    }

    现在我们注册以监听通话记录数据库中的变化:

    mContentObserver = new BlockerContentObserver(new Handler(), context);

    然后我们创建一个方法来注册事件或取消注册:

    /*handles the registration of our content observer used for monitoring the call log*/
    private void RegisterContentObserver(boolean shouldRegister){
        if(shouldRegister)
        {
    
            context.getContentResolver().registerContentObserver(
                    android.provider.CallLog.Calls.CONTENT_URI,
                    true,
                    mContentObserver);
    
        }
    else {
    
        try {  
            context.getContentResolver().unregisterContentObserver(mContentObserver);  
        } catch (IllegalStateException ise) {  
            // Do Nothing.  Observer has already been unregistered.  
        }  
    
    }
        }
    

    【讨论】:

    • 它不工作,知道吗?它确实调用了删除函数,bool 为真,但该数字原样在日志历史记录中
    • 你设置了 contentObserver 吗?当通话记录更改时,您是否收到发送给您的事件?
    【解决方案3】:

    我只是尝试这种方法,它在我的 HTC 4.0.3 上运行良好

    private void deleteNumber() {
                try {
                    String strNumberOne[] = { "00577698160" };
                    Cursor cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, null, CallLog.Calls.NUMBER + " = ? ", strNumberOne, "");
                    boolean bol = cursor.moveToFirst();
                    if (bol) {
                        do {
                            int idOfRowToDelete = cursor.getInt(cursor.getColumnIndex(CallLog.Calls._ID));
                            getContentResolver().delete(Uri.withAppendedPath(CallLog.Calls.CONTENT_URI, String.valueOf(idOfRowToDelete)), "", null);
                        } while (cursor.moveToNext());
                    }
                } catch (Exception ex) {
                    System.out.print("Exception here ");
                }
            }
    

    【讨论】:

      【解决方案4】:

      早期答案的修改版本。你真的不需要一个while循环。另外你不需要Thread.sleep(4000),为CallLog.Calls.CONTENT_URI注册一个ContentObserver并在onChange中调用以下方法。但在调用之前,请确保您取消注册 ContentObserver

      public static void deleteLastCallLog(Context context, String phoneNumber) {
      
              try {
                  //Thread.sleep(4000);
                  String strNumberOne[] = { phoneNumber };
                  Cursor cursor = context.getContentResolver().query(
                          CallLog.Calls.CONTENT_URI, null,
                          CallLog.Calls.NUMBER + " = ? ", strNumberOne, CallLog.Calls.DATE + " DESC");
      
                  if (cursor.moveToFirst()) {
                          int idOfRowToDelete = cursor.getInt(cursor.getColumnIndex(CallLog.Calls._ID));                      
                          int foo = context.getContentResolver().delete(
                                  CallLog.Calls.CONTENT_URI,
                                  CallLog.Calls._ID + " = ? ",
                                  new String[] { String.valueOf(idOfRowToDelete) });
      
                  }
              } catch (Exception ex) {
                  Log.v("deleteNumber",
                          "Exception, unable to remove # from call log: "
                                  + ex.toString());
              }
          }
      

      【讨论】:

      • 关于内容观察者的好主意,我会尽力为您投票并更新我的评论以帮助其他人。
      • 为什么需要光标循环。 ContentResolver.delete() 可以删除多条记录,我错了吗? getContentResolver().delete(CallLog.Calls.CONTENT_URI, CallLog.Calls.NUMBER +"=?", new String[]{phoneNumber}); 应该没问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      相关资源
      最近更新 更多