使用ContentResolver删除FDN(固定拨号号码)失败问题求助
FDN固定拨号删除操作失效问题解决
核心排查与解决方案
1. 确认使用正确的FDN操作Uri
FDN固定拨号对应的Content Uri是ContactsContract.FixedDialingNumbers.CONTENT_URI,而非普通联系人的Uri。误用普通联系人Uri会导致删除操作不生效,但系统返回虚假的删除行数。
2. 修正Where子句语法与参数绑定
你的where子句存在语法错误(如单引号配对错误),建议使用参数绑定方式构造查询条件,避免字符串拼接导致的语法问题:
// 正确的参数绑定写法 String whereClause = "number = ? AND tag = ? AND pin2 = ?"; String[] selectionArgs = new String[]{"132413", "exp", "141234"}; int deletedRows = getContentResolver().delete( ContactsContract.FixedDialingNumbers.CONTENT_URI, whereClause, selectionArgs );
注意:number字段可能存储带国家代码的格式(如+86132413),需确保匹配实际存储的号码格式,否则会出现匹配不到记录但返回删除行数的情况。
3. 验证PIN2的有效性与前置验证
FDN操作依赖SIM卡的PIN2码,部分设备要求先验证PIN2再执行删除:
// 先验证PIN2 boolean pinValid = ContactsContract.FixedDialingNumbers.setPin( getContentResolver(), "141234" // 你的SIM卡PIN2码 ); if (pinValid) { // 验证成功后执行删除,此时可无需在where子句中重复传入pin2 String whereClause = "number = ? AND tag = ?"; String[] selectionArgs = new String[]{"132413", "exp"}; int deletedRows = getContentResolver().delete( ContactsContract.FixedDialingNumbers.CONTENT_URI, whereClause, selectionArgs ); }
如果PIN2码错误,即使系统返回删除行数,SIM卡层面也会拒绝执行删除操作。
4. 排除缓存与查询验证问题
删除后需重新查询FDN列表确认结果,可通过getContentResolver().notifyChange(ContactsContract.FixedDialingNumbers.CONTENT_URI, null)触发数据刷新,避免缓存导致的误判。
内容的提问来源于stack exchange,提问作者HeyJoe
相关产品推荐
相关产品推荐

