问题 呼叫结束后从呼叫记录中删除呼叫


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


5616
2018-03-19 10:08


起源

请选择你的答案。 - clauziere


答案:


首先,您必须设置广播接收器以检测手机状态。这是完全相同的问题: Stackoverflow - 在呼叫结束时被触发的意图?

现在删除通话记录条目,这是谷歌上的第一个链接: 在Android中调用日志删除 
在示例中,他删除了特定号码的所有呼叫条目,但您可以更改查询以删除特定呼叫日志ID的条目。

希望这可以帮助。 干杯


5
2017-07-20 14:24





无论如何我使用4.2.2我必须修改aftab的代码,因为它不适合我。这可能是一个asych问题,我试图做的是在来电结束后立即更新通话记录。我想在删除条目之前我必须给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);

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

/*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.  
    }  

}
    }

4
2018-04-24 23:04



它没用,有什么想法吗?它确实调用了delete函数,bool为true,但是数字在日志历史记录中 - Muhammad Umar
你设置了contentObserver吗?当呼叫日志发生变化时,您是否收到了发送给您的事件? - j2emanue


我只是尝试这种方法,它在我的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 ");
            }
        }

2
2017-11-20 12:06





早期答案的修改版本。你真的不需要一个while循环。你也不需要 Thread.sleep(4000),注册一个 ContentObserver 对于 CallLog.Calls.CONTENT_URI 并调用以下方法 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());
        }
    }

2
2017-07-31 16:38



关于内容观察者的优秀想法,我会尝试提升你的观点并更新我的评论,以帮助他人。 - j2emanue
为什么需要游标循环。 ContentResolver.delete() 可以删除多条记录,我错了吗? getContentResolver().delete(CallLog.Calls.CONTENT_URI, CallLog.Calls.NUMBER +"=?", new String[]{phoneNumber}); 应该没事 - osrl