安卓实现通讯录变化的监听

本人安卓小菜鸟,因为最近要做个小项目,需要对安卓的通讯录进行监听。在网上找资料呀,东翻翻西看看的。始终没找到满意的。最后在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值