androidcalllog
① android 如何读取通话记录
安卓手机上的通话记录可以按照以下步骤来进行获取(包括删除的通话记录)。
1,首先对安卓手机进行一键Root,方法很简单,在电脑上安装“360一键Root”软件,然后按提示,将安卓手机用数据线连接到电脑上对其进行Root即可。
② android 同一号码通话记录次数怎么获得
通过CallLog.CONTENT_URI来查询通话记录, 然后自己统计
祝你愉快,满意请采纳哦
③ 恢复通话记录的代码
(一) 前言
Android默认提供了联系人备份到sd卡的功能(代码在com.android.vcard包里面),我们可以把联系人导出成.vcf文件存在sd卡中;如果换手机了,我们又可以把联系人从sd卡文件中导入进来。那么,通话记录我们也能不能做出类似的功能呢?答案是肯定的!
(二) 导出通话记录
既然是备份通话记录,那就肯定包括导出和导入的功能,这里我们先讲导出通话记录。
1. 根据通话记录导出的规范,导出的文件一般以.vcl后缀结尾,中间的内容是
复制代码 代码如下:
BEGIN:VCALL
SLOT:0 //卡槽号 0:单卡手机 1: 双卡手机卡槽1 2: 双卡手机卡槽2
TYPE:1 //电话类型 1:接入电话,2: 呼出电话 3: 未接电话
Date: 2013/02/12 14:11:12 GMT //来电或者去点的时间 备份时以GMT时间记录,恢复时显示手机时区对应时间
NUMBER:+86134xxxxx //对方号码
DURATION:5 //持续时间,秒数
END:VCALL
那么这里就是一条通话记录的存储格式了,以BEGIN:VCALL 开始 END:VCALL结束。 //表示的是该字段的含义,只是为了让大家理解,不会导入到实际的文件中去。那么我们来看实际怎么导出的。
2. 查询通话记录列表
ok.. 既然是保存通话记录,那么首先要查询通话记录
Android里面提供了一个CallLogProvider来满足大家的这个需求,它在系统中配置的名字是“call_log”, 所以大家只要提供一个这样的Uri就可以查询了,比如:
复制代码 代码如下:
Uri uri = Uri.parse("context://call_log/calls");
Cursor c = mContext.getContentResolver().query(uri, xxx, xxx );
这样就可以查询出所有的通话记录,得到游标。。
④ 如何导入android系统的通话记录
涉及到对通话记录的读和写、需要在sd卡上写存放通话记录数据的文件,所以需要加权限:
[html] view plain
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
首先,通话记录的获取,只需要获取部分字段即可满足即可:
将数据保存到一个自定义的Model对象中。
[html] view plain
Cursor cursor = mContext.getContentResolver().query(CallLog.Calls.CONTENT_URI, null, "date > ?", new String[] { "" + timestamp }, CallLog.Calls.DEFAULT_SORT_ORDER);
while (cursor.moveToNext()) {
CalllogModel calllogModel = new CalllogModel();
// name
calllogModel.setName(cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME)));
// start call datetime
calllogModel.setDatetime(cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)));
// phonenumber
calllogModel.setNumber(cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)));
// ration
calllogModel.setDuration(cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DURATION)));
// call type
calllogModel.setType(cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)));
// is read
calllogModel.setIs_read(cursor.getInt(cursor.getColumnIndex(CallLog.Calls.IS_READ)));
modifyVector(0, calllogModel, ADD_VECTOR); //调用保存到文件的方法
}
cursor.close();
cursor = null;
将通话记录导入到系统的数据库中:
[html] view plain
ContentResolver contentResolver = mContext.getContentResolver();
values.put(CallLog.Calls.CACHED_NAME, calllogModel.getName());
values.put(CallLog.Calls.NUMBER, calllogModel.getNumber());
values.put(CallLog.Calls.DATE, calllogModel.getDatetime());
values.put(CallLog.Calls.DURATION, calllogModel.getDuration());
values.put(CallLog.Calls.IS_READ, calllogModel.getIs_read());
values.put(CallLog.Calls.TYPE, calllogModel.getType());
contentResolver.insert(CallLog.Calls.CONTENT_URI, values);
还有两点考虑:
1. 通话记录的保存方式:
选择通过文本文件来保存,一行算足一条通话记录。
每个通话记录以字符串的形式保存到文本文件
java中提供BufferReader和BufferWriter两个类可以支持一行一行的读和写
在导入通话记录的时候,读到一行记录,就处理一行:string->json->model->contentvalues->contentResolver.insert
2. 处理效率和OOM异常避免的情况
在处理导出通话记录的时候,通话记录的条数可能成千上万条。
在这样的情况下,需要注意:
a. 那么多记录数不能全部写到内存中,暂据的内存太大,容易报OOM的错误
b. 将那些数据写入到文件中的时候,不能每一次都打开IO流和关闭IO流,耗时耗资源
解决的方法是,维护一个集合Vector<model>,当从系统数据库中读取到一条记录的时候,将其vector,add(model);当每处理完一个model之后,通过vector.remove(0)获取新的Model对象进行处理。
读取记录的过程和处理记录的过程,用两个线程同步执行。
保证多线程下数据的安全考虑,对该集合变量的操作,用同步锁对其进行限定
[html] view plain
/**
* 需要增加一个对象到集合的时候,type=1;需要获取一个对象的时候,type=2
* @param index
* @param calllogModel
* @param type
* @return
*/
private static synchronized CalllogModel modifyVector(int index, CalllogModel calllogModel, int type) {
switch (type) {
case 1:
if (calllogModels.size()>1000) { //确保集合的体积不会过大
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
calllogModels.add(calllogModel);
break;
case 2:
if (!calllogModels.isEmpty()) {
return calllogModels.remove(0);
} else {
return null;
}
default:
break;
}
return null;
}
⑤ android 开发怎么获取去电的通话时长
StringBuilder smsBuilder1 = new StringBuilder();
String str = null; String strNumber,strName = ""; int type; long callTime; Date date; String time= ""; ContentResolver cr = getContentResolver(); final Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI, new String[]{CallLog.Calls.NUMBER,CallLog.Calls.CACHED_NAME,CallLog.Calls.TYPE, CallLog.Calls.DATE,CallLog.Calls.DURATION}, null, null,CallLog.Calls.DEFAULT_SORT_ORDER); cursor.moveToPosition(0); do{ strNumber = cursor.getString(0); //呼叫号码 strName = cursor.getString(1); //联系人姓名 type = cursor.getInt(2); //来电:1,拨出:2,未接:3 public static final int INCOMING_TYPE = 1; public static final int OUTGOING_TYPE = 2; public static final int MISSED_TYPE = 3; if(type == 1){ str = "来电"; }else if(type == 2){ str = "拨出"; }else if(type == 3){ str = "未接"; } long ration = cursor.getLong(4); //通话时间 SimpleDateFormat sfd = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); date = new Date(Long.parseLong(cursor.getString(3))); time = sfd.format(date); smsBuilder1.append(strNumber+","); smsBuilder1.append(strName+","); smsBuilder1.append(str+","); smsBuilder1.append(ration+","); smsBuilder1.append(time+"\n"); }while(cursor.moveToNext()); textView2.setText(smsBuilder1.toString());
添加权限:
<uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permission android:name="android.permission.READ_CALL_LOG"/> <uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
⑥ android对通话记录删除过后怎么更新数据
1.删除通话记录
2.
负责存放呼叫记录的内容提供者源码在ContactsProvider项目下:
源码路径:
com/android/providers/contacts/CallLogProvider.java
使用到的数据库在:
/data/data/com.android.providers.contacts/databases/contacts2.db
表名:calls
呼叫记录有三种类型:
来电: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>
3.需要声明的权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
4.系统的通话记录,是通过ContentProvider来对外共享的
5. Uri
CallLog.Calls.CONTENT_URI :等价于:Uri.parse("content://call_log/calls");
6.查询出所有记录
ContentResolver resolver = getContentResolver();
resolver.query(CallLog.Calls.CONTENT_URI, null, null, new String[]{"15101689022"}, null);
7.查询某一个联系人的所有记录(按电话号码)
resolver.query(CallLog.Calls.CONTENT_URI, null, "number=?", new String[]{"15101689022"}, null);
8.查询某一个联系人的所有未接电话记录(按电话号码)
resolver.query(CallLog.Calls.CONTENT_URI, null, "number=? and type=3", new String[]{"15101689022"}, null);
8.删除某联系人最近的一次来电
[html]view plain
/*本代码因为在Activity中,所以可以直接调用getContentResolver()。这个方法实际上是Context中定义的。*/
ContentResolverresolver=getContentResolver();
/*这里涉及到内容提供者的知识,其实这里是直接在操作Android的数据库,十分痛苦*/
Cursorcursor=resolver.query(CallLog.Calls.CONTENT_URI,newString[]{"_id"},"number=?and(type=1ortype=3)",newString[]{"15101689022"},"_iddesclimit1");
if(cursor.moveToFirst()){
intid=cursor.getInt(0);
resolver.delete(CallLog.Calls.CONTENT_URI,"_id=?",newString[]{id+""});
}
⑦ android中怎样声明操作通话记录的权利
Android的通话记录都实现在静态类android.provider.CallLog.Calls中。
首先需要读写通话记录的的权限
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
读取
Cursor cursor = context.getContentResolver()
.query(CallLog.Calls.CONTENT_URI,
new String[] { CallLog.Calls.NUMBER,
CallLog.Calls.CACHED_NAME,
CallLog.Calls.TYPE,
CallLog.Calls.DATE,
CallLog.Calls.DURATION}, null,
null, CallLog.Calls.DEFAULT_SORT_ORDER);
写入
ContentValues values = new ContentValues();
values.put(CallLog.Calls.NUMBER, "13200000002");
values.put(CallLog.Calls.TYPE, CallLog.Calls.OUTGOING_TYPE);
values.put(CallLog.Calls.DATE, System.currentTimeMillis());
values.put(CallLog.Calls.DURATION, 1);
context.getContentResolver().insert(CallLog.Calls.CONTENT_URI, values);
解释一下各字段的含义:
public static final String NUMBER:电话号码,TEXT
public static final String TYPE: 通话记录类型,可为呼入INCOMING_TYPE,呼出OUTGOING_TYPE和未接MISSED_TYPE。
public static final String CACHED_NAME:缓存的联系人名字, TEXT
public static final String DATE: 发生通话的时间,INTEGER
public static final String DURATION: 通话进行的时间,INTEGER
常用的应该就这么多。
⑧ Android 中TabHost子选项卡里实现Activity跳转而选项卡不消失
可以的,如果你有源码可以直接参考contacts中dailpad和calllog的实现。
没有的话去下载一份吧,一看就懂的 : )
⑨ android 获取最近联系人姓名(最佳答案加10分啊)
没有别的办法,就是这个笨法
⑩ Android源码问题,拨打完电话会更新通话记录列表,通过一个监听来实现查询CallLogProvider,有了解的吗
可以根据Uri来反向查找调用者!