首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 刪除通話記錄失敗?缺權限或 URI 錯誤雙重檢查

     編輯:程式設計疑難解答

核心權限(必加)

<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />

Android 6.0+ (API 23+) 還需動態申請:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CALL_LOG}, REQ_CODE);
}

正確刪除代碼

// 1. 獲取 _id(長整型)
long callId = cursor.getLong(cursor.getColumnIndex(CallLog.Calls._ID));

// 2. 構建帶 ID 的 URI
Uri deleteUri = ContentUris.withAppendedId(CallLog.Calls.CONTENT_URI, callId);

// 3. 執行刪除
int rows = getContentResolver().delete(deleteUri, null, null);
if (rows > 0) Log.d("CallLog", "刪除成功: " + callId);

常見錯誤對比

錯誤寫法問題正確寫法
delete(CallLog.Calls.CONTENT_URI, "_id=?", new String[]{id})WHERE 子句字符串拼接,類型轉換易出錯ContentUris.withAppendedId(CONTENT_URI, id) 直接定位行
用 _id 字符串而非 Long類型不匹配,刪除 0 行cursor.getLong(...) 獲取長整型
缺 WRITE_CALL_LOG 權限SecurityException / 靜默失敗清單靜態聲明 + 運行時動態申請

Android 10+ (Q) 變化

  • 通話記錄權限歸屬變更,部分設備需 READ_CALL_LOG + WRITE_CALL_LOG 均授權。
  • 作用域存儲不影響 CallLog.Calls Provider,但建議適配 MediaStore 風格查詢。

調試技巧

// 打印刪除前後行數對比
Cursor c = resolver.query(CallLog.Calls.CONTENT_URI, new String[]{CallLog.Calls._ID}, null, null, null);
Log.d("CountBefore", c.getCount() + "");
// ... delete ...
Cursor c2 = resolver.query(CallLog.Calls.CONTENT_URI, new String[]{CallLog.Calls._ID}, null, null, null);
Log.d("CountAfter", c2.getCount() + "");
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved