【发布时间】:2011-03-19 10:08:20
【问题描述】:
我是 Android 开发新手。我想拨打一个号码,但我不想将号码存储在我的通话记录中。通话结束后如何从通话记录中删除号码?
【问题讨论】:
-
请选择您的答案。
标签: android calling-convention
我是 Android 开发新手。我想拨打一个号码,但我不想将号码存储在我的通话记录中。通话结束后如何从通话记录中删除号码?
【问题讨论】:
标签: android calling-convention
首先您必须设置一个广播接收器来检测手机状态。这是完全相同的问题:Stackoverflow - Intent to be fired when a call ends?
现在要删除通话记录条目,这是 google 上的第一个链接:Call log deletion in Android
在示例中,他删除了特定号码的所有通话条目,但您可以更改查询以删除特定通话记录 ID 的条目。
希望这会有所帮助。 干杯
【讨论】:
无论如何我都在使用 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.
}
}
}
【讨论】:
我只是尝试这种方法,它在我的 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 ");
}
}
【讨论】:
早期答案的修改版本。你真的不需要一个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}); 应该没问题