目的:确定通讯录是否发生变化

根据:參见ContactsContract.RawContacts类中的VERSION常量,该值是仅仅读的,当通讯录发生变化时,都会使该值变化

方法:version值是相应每条通讯录数据的,假设有100条,则有100个该值,我说採用的推断方法是这种

1、获取全部version值,组成字符串

2、因为该字符串可能非常长,所以採用MD5变换短字符串

3、与之前的字符串比較,将新的保存到SharedPreferences

以下三段代码则实现了查看通讯录是否变化

/**
* 获得通讯录的version
*
* @return
*/
private String getContactsVersion() {
String version = null;
StringBuffer sb = new StringBuffer();
Cursor raws=null;
try{
raws = mContext.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI,
null, null, null, null);
while (raws.moveToNext()) {
version = raws.getString(raws.getColumnIndex(ContactsContract.RawContacts.VERSION)); sb.append(version);
}
}catch(Exception e){
e.printStackTrace();
}finally
{
if(raws!=null){
raws.close();
} } return sb.toString();
}
 /**
* 将字符串version转换成MD5格式的
*
* @param s
* @return
*/
private String stringToMd5(String s) {
byte[] value = s.getBytes();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(value);
byte[] temp = md.digest();
StringBuilder sb = new StringBuilder();
for (byte b : temp) {
sb.append(Integer.toHexString(b & 0xff));
}
String md5Version = sb.toString();
Editor editor = spf.edit();
editor.putString("contact_version", md5Version);
editor.commit(); return md5Version;
} catch (NoSuchAlgorithmException e) { e.printStackTrace();
}
return null;
}
 /**
* 推断是不是有更新通讯录 返回true表示有更新,返回false表示没有更新
*/
public Boolean isContactUpdate() {
String oldVersion = spf.getString("contact_version", "first");
String newVersion = stringToMd5(getContactsVersion());
if (Log.isLoggable("version", Log.DEBUG)){
Log.d("version", "old version---" + oldVersion);
Log.d("version", "new version---" + newVersion);
} return (!newVersion.equals(oldVersion));
}

Android 查看通讯录Contacts是否发生变化的更多相关文章

  1. Android API之android.provider.ContactsContract.Contacts

    android.provider.ContactsContract.Contacts 对应contacts数据表.RawContacts的一个聚合(aggregate)代表同一个人.每个人在数据表co ...

  2. Android:联系人Contacts之ContentResolver query 参数详解

    注:本片整理自 http://blog.csdn.net/wssiqi/article/details/8132603 1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人N ...

  3. Android向通讯录添加联系人的一般方法

    Android向通讯录添加联系人的一般方法 以一个简单的例子加以说明,记得需要相应的权限: 测试代码,关键的内容就在add函数里面. package zhangphil.demo; import an ...

  4. [ 原创 ]学习笔记-Android 学习笔记 Contacts (一)ContentResolver query 参数详解 [转载]

    此博文转载自:http://blog.csdn.net/wssiqi/article/details/8132603 1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人NA ...

  5. Android 查看 无wifi/usb设备的logcat方法

    Android 查看 无wifi/usb设备的logcat方法 一.情况 一个定制Android设备,wifi被去掉.我须要调试一个USB设备这样也无法用usb来输出logcat. 由于这个USB设备 ...

  6. Android 查看App冷启动时间/热启动时间/页面打开时间

    Android 查看App冷启动时间/热启动时间/页面打开时间 冷启动时间 热启动时间 页面打开时间 通过adb查看 adb shell am start -W packageName/Activit ...

  7. Android 查看Apk签名方式V1和V2

    Android 查看Apk签名方式V1和V2 java -jar apksigner.jar verify -v my.apk -- Verifies Verified using v1 scheme ...

  8. Android 查看项目依赖树的四种方式

    Android 查看项目依赖树的四种方式: 方式一: ./gradlew 模块名:dependencies //查看单独模块的依赖 ./gradlew :app:dependencies --conf ...

  9. android操作通讯录的联系人

    界面配置文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     and ...

随机推荐

  1. IOS Application生命周期

    第一阶段 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *) ...

  2. C# 基础概念之延迟加载

    本文来自:http://kb.cnblogs.com/page/99182/ 作者: 杨延成  来源: 博客园  发布时间: 2011-05-01 15:06  阅读: 4662 次  推荐: 0   ...

  3. ArcSDE for Oracle表空间管理——暂时(TEMP)表空间

    Oracle暂时表空间主要用来做查询和存放一些缓冲区数据.暂时表空间消耗的主要原因是须要对查询的中间结果进行排序. 重新启动数据库能够释放暂时表空间,假设不能重新启动实例,而一直保持问题sql语句的运 ...

  4. Swift观察者模式

    用swift写一个观察者模式,集合了swift语言中类,数组,协议,方法,字符串,条件控制语句等一些语法.简单介绍下观察者模式,在观察者模式中,会改变的是主题的状态以及观察者的数目.用这个模式,可以改 ...

  5. 使用Xcode上传代码至GitHub

    几乎所有iOS程序员都上过GitHub寻找开源类库,的确,GitHub上有大量优秀的开源类库供大家学习.但是如何在Xcode中上传代码至GitHub呢? (开始之前先安装git,具体方法这里讲的很清楚 ...

  6. Linux三种关机/重启系统的命令

    Linux提供了三种关机/重启系统的命令:shutdown.halt和reboot.这三个命令在一般情况下只有 系统的超级用户(一般是指root)才可以执行.输入没有参数的shutdown命令,两分钟 ...

  7. U盘变小恢复工具——亲测完美可用

    大白菜U盘,装系统后,U盘损坏,格盘后8G只剩345M,用usbboot恢复到了2G容量.离8G还差很远.用U盘变小恢复工具后,完美恢复到原来大小.在此记录一下,以待下次遇到相似情况使用. 原文地址 ...

  8. (转载) socket:10038错误{winSock的一个bug:当closesocket多次错误使用时会导致问题}

    这几天想在一个开源的代码上进行修改,以期研发出一个产品出来.       程序原来是单线程网络程序,需要修改为多线程,修改之后,总是出问题,辅助线程中的recv函数总是运行一阵子之后收到长度为-1的数 ...

  9. 生成shadow中hash字串

    [root@master base]# openssl passwd -1 -salt 123Password: $1$123$2rm.J6pr3p.rmj6YoKSQ8.[root@master b ...

  10. html5学习笔记2

    css3选择器 1.通过元素的关键字,如p,div等 2.通过id属性 3.通过class属性引用 3.1通过class属性引用p标签,如:p.text{}//text样式只适用于p 4.通过任意键引 ...