Between step 3 and step 5, an incoming call can still be rejected because the telephony stack's mBlockedNumbers cache hasn't been invalidated. Typical window: 50-150ms . 5. The "Ghost Block" Phenomenon A persistent issue in Android 12-14 is the Ghost Block — a contact appears unblocked, but SMS/MMS messages still fail to arrive.
// 6. Force a contacts provider sync val cr = context.contentResolver cr.update(ContactsContract.RawContacts.CONTENT_URI, ContentValues().apply put("contact_blocked", 0) , "phone_number = ?", arrayOf(normalized)) Unblocking a contact on Android is a distributed transaction problem, not a simple state change. The complexity arises from the fragmentation between telephony, SMS, contacts, and carrier systems. As of Android 15, the platform is moving toward a unified BlockedNumberService API that promises eventual consistency within 500ms. However, for older devices (Android 12 and below), a full unblock is only guaranteed after a device reboot or a carrier network cache timeout — a fact rarely documented in user-facing help articles. unblock contact android
Android 15 introduces a new BLOCKLIST_SYNC broadcast that forces real-time unblock across all providers. 10. Implementation Guide: Robust Unblock Function For developers implementing a "Contact Unblock" feature, the minimal robust sequence is: Between step 3 and step 5, an incoming
fun fullyUnblockContact(context: Context, phoneNumber: String, subId: Int) val normalized = PhoneNumberUtils.normalizeNumber(phoneNumber) // 1. Delete from system blocked provider context.contentResolver.delete( BlockedNumbers.CONTENT_URI, "number = ?", arrayOf(normalized) ) The "Ghost Block" Phenomenon A persistent issue in