呼叫记录有三种类型: 来电:CallLog.Calls.INCOMING_TYPE (常量值:1) 已拨:CallLog.Calls.OUTGOING_TYPE(常量值:2) 未接:CallLog.Calls.MISSED_TYPE(常量值:3) 查看源码中的声明: <provider android:name="CallLogProvider" android:authorities="call_log" android:syncable="false" android:multiprocess="false" android:readPermission="android.permission.READ_CONTACTS" android:writePermission="android.permission.WRITE_CONTACTS"> </provider> 需要声明的权限 <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> 系统的通话记录,是通过 ContentProvider 来对外共享的 Uri CallLog.Calls.CONTENT_URI : 等价于:Uri.parse("content://call_log/calls"); 查询出所有记录 ContentResolver resolver = getContentResolver(); resolver.query(CallLog.Calls.CONTENT_URI, null, null, new String[]{"15101689022"}, null); 在Android系统中,通话记录是用户通信历史的重要组成部分,提供了对过去拨打、接听和错过电话的记录。要操作这些通话记录,开发者需要了解Android的ContentProvider机制以及相关的权限管理。以下将详细介绍如何在Android应用中操作通话记录。 通话记录有三种类型,它们用常量来表示: 1. **来电**:`CallLog.Calls.INCOMING_TYPE`,其常量值为1,代表接收到的电话。 2. **已拨**:`CallLog.Calls.OUTGOING_TYPE`,其常量值为2,代表已拨出的电话。 3. **未接**:`CallLog.Calls.MISSED_TYPE`,其常量值为3,代表未接听到的电话。 在AndroidManifest.xml文件中,需要声明访问通话记录的权限,分别是读取和写入权限: ```xml <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> ``` 需要注意的是,这里声明的权限是`READ_CONTACTS`和`WRITE_CONTACTS`,而不是`READ_CALL_LOG`和`WRITE_CALL_LOG`,这是因为从Android 6.0(API级别23)开始,访问通话记录权限属于危险权限,需要在运行时动态请求。 通话记录是通过ContentProvider来对外共享的,这个ContentProvider的Uri是`CallLog.Calls.CONTENT_URI`,等价于`Uri.parse("content://call_log/calls")`。ContentProvider是Android中数据共享的标准接口,它允许应用程序间安全地共享数据。 查询通话记录通常使用`ContentResolver`的`query()`方法。例如,要获取所有通话记录,可以这样做: ```java ContentResolver resolver = getContentResolver(); resolver.query(CallLog.Calls.CONTENT_URI, null, null, null, null); ``` 如果想要查询特定电话号码的所有记录,比如`15101689022`,则可以这样: ```java resolver.query(CallLog.Calls.CONTENT_URI, null, "number=?", new String[]{"15101689022"}, null); ``` 而要查询该电话号码的所有未接电话记录,可以使用以下条件: ```java resolver.query(CallLog.Calls.CONTENT_URI, null, "number=? AND type=3", new String[]{"15101689022"}, null); ``` 删除通话记录涉及对ContentProvider的写操作。例如,要删除某联系人(如`15101689022`)的最新一次来电,可以这样实现: ```java ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, new String[]{"_id"}, "number=? AND (type=1 OR type=3)", new String[]{"15101689022"}, "_id DESC LIMIT 1"); if (cursor.moveToFirst()) { int id = cursor.getInt(0); resolver.delete(CallLog.Calls.CONTENT_URI, "_id=?", new String[]{id + ""}); } ``` 这段代码首先查询了最新一条与给定电话号码相关的来电记录的ID,然后根据这个ID执行删除操作。 操作Android的通话记录需要理解ContentProvider的工作原理,掌握如何使用`ContentResolver`进行数据查询和修改,并确保正确处理权限问题。在实际开发中,还要注意不同Android版本可能存在的兼容性差异,以及遵循最佳实践,如使用异步操作来处理可能的耗时操作,以提高用户体验。
- 福特翼虎2014-09-01值得学习 正在做这个东西
- 粉丝: 1
- 资源: 12
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助