本人安卓小菜鸟,因为最近要做个小项目,需要对安卓的通讯录进行监听。在网上找资料呀,东翻翻西看看的。始终没找到满意的。最后在csdn上面看到一篇转载的文章
http://blog.csdn.net/xyz_lmn/article/details/7817098提供了给我非常重要的思路,说实话,以前做东西都是直接copy,改改代码就好了,现在自己做出来,确实蛮有成就感的,下面是代码,代码很不规范,也有很多需要优化和改进的地方,望见谅。总之,思路很重要,希望有看到小弟作品的多给小弟指导和建议。其实通知栏那块是自己看Android API写的。具体代码哪些可以删除和修改还不清楚,菜鸟嘛,慢慢学
package com.example.contactlistener;
import java.util.ArrayList;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract.RawContacts;
import android.app.Activity;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
private String TAG="ABC";
private String DEL="DEL";
private static final int CONTACT_CHANGE = 1;
private contactContentObservers contactobserver;
ArrayList<String> changedContacts = new ArrayList<String>();
ArrayList<String> deletedContacts = new ArrayList<String>();
ArrayList<String> addedContacts = new ArrayList<String>();
private static final String[] PHONES_PROJECTION = new String[] {
RawContacts._ID,RawContacts.VERSION };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contactobserver=new contactContentObservers(this,mHandler);
queryIdAndVersion();
registerContentObservers();
}
private void registerContentObservers() {
// TODO 自动生成的方法存根
//注册一个监听数据库的监听器
this.getContentResolver().registerContentObserver(RawContacts.CONTENT_URI, true, contactobserver);
}
//程序刚开始时运行,存入sd.xml后面使用
private void queryIdAndVersion()
{
String id="";
String version="";
ContentResolver resolver=this.getContentResolver();
Cursor phoneCursor=resolver.query(RawContacts.CONTENT_URI, PHONES_PROJECTION, RawContacts.DELETED+"==0 and 1=="+RawContacts.DIRTY, null, null);
if(phoneCursor!=null) //此处取判断dirty为1的原因是我发现我的通讯录的db会被手机QQ改变,手机qq会把dirty变成0.。。安卓通讯录数据的删除只是把deleted置为1
{
while (phoneCursor.moveToNext())
{
id+=phoneCursor.getString(0)+"#";
version+= phoneCursor.getString(1)+"#";
Log.v(TAG,"ID: "+phoneCursor.getString(0));
Log.v(TAG,"Version: "+phoneCursor.getString(1));
}
SharedPreferences sp=this.getSharedPreferences("sd", MODE_PRIVATE);
Editor editor=sp.edit();
editor.putString("id",id);
editor.putString("version",version);
editor.commit();
}
phoneCursor.close();
}
//进一步判断是否修改通讯录。注意:打电话时会触发到此方法,因为监听的URi的关系
private void bChange()
{
changedContacts.clear();
deletedContacts.clear();
deletedContacts.clear();
String idStr;
String versionStr ;
ArrayList<String> newid=new ArrayList<String>();
ArrayList<String> newversion=new ArrayList<String>();
SharedPreferences sp=this.getSharedPreferences("sd", MODE_PRIVATE);
idStr=sp.getString("id", "");
versionStr=sp.getString("version", "");
String []mid=idStr.split("#");
String []mversion=versionStr.split("#");
ContentResolver resolver=this.getContentResolver();
Cursor phoneCursor=resolver.query(RawContacts.CONTENT_URI, PHONES_PROJECTION, RawContacts.DELETED+"==0 and 1=="+RawContacts.DIRTY, null, null);
while(phoneCursor.moveToNext())
{
newid.add(phoneCursor.getString(0));
newversion.add(phoneCursor.getString(1));
}
phoneCursor.close();
for(int i=0;i<mid.length;i++)
{
int k=newid.size();
int j;
for(j=0;j<k;j++)
{
//找到了,但是版本不一样,说明更新了此联系人的信息
if(mid[i].equals(newid.get(j)))
{
if(!(mversion[i].equals(newversion.get(j))))
{
changedContacts.add(newid.get(j)+"#"+newversion.get(j));
newid.remove(j);
newversion.remove(j);
break;
}
if(mversion[i].equals(newversion.get(j)))
{
newid.remove(j);
newversion.remove(j);
break;
}
}
}
//如果没有在新的链表中找到联系人
if(j>=k)
{
deletedContacts.add(mid[i]+"#"+mversion[i]);
Log.v(DEL,mid[i]+ " " +mversion[i]);
}
}
//查找新增加的人员
int n=newid.size();
for(int m=0;m<n;m++)
{
addedContacts.add(newid.get(m)+"#"+newversion.get(m));
}
notifyMessage();
}
private Handler mHandler=new Handler()
{
public void handleMessage(Message msg) {
switch(msg.what)
{
case CONTACT_CHANGE:
bChange();
break;
default:
break;
}
}
};
//通知栏消息
private void notifyMessage()
{
NotificationCompat.Builder mBuilder=
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.uu)
.setContentTitle("My notification")
.setContentText("修改"+changedContacts.size()+" 删除"+deletedContacts.size()+" 增加"+addedContacts.size());
changedContacts.clear();
deletedContacts.clear();
addedContacts.clear();
Intent resultIntent=new Intent(this,MyClass.class);
TaskStackBuilder stackBuilder=TaskStackBuilder.create(this);
stackBuilder.addParentStack(MyClass.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent=
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, mBuilder.build());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
源码地址
http://download.csdn.net/detail/shenxy9720/8249153