安卓源码通讯录
‘壹’ android控制第三方应用软件访问通信录的权限
如果是修改你正在开发软件的权限的话,在AndroidManifest.xml里面修改,增加相应的权限。
访问通讯录的是:
<!-- 读取联系人权限 -->
<uses-permissionandroid:name="android.permission.READ_CONTACTS"/>
<!-- 拨打电话权限 -->
<uses-permissionandroid:name="android.permission.CALL_PHONE"/>
‘贰’ android 实现微信通讯录(联系人分类,并有边栏字母滑动效果,并可以查询联系人) 源代码
多编译一下别人的包包
‘叁’ eclipse安卓手机通讯录
Android 系统给我们提供了访问通讯录的接口,通过接口获取通讯录信息。Adapter 与 View 的连接主要依靠 getView 这个方法返回我们需要的自定义 view。 ListView 是 Android App 中一个最最最常用的控件了,所以如何让 ListView 流畅运行,获取良好的用户体验是非常重要的。 对 ListView 优化就是对 Adapter 中的 getView 方法进行优化。
核心内容:
1.获取手机通讯录
2.数据封装
3.创建 Adapter
4.优化适配器
开发环境:Eclipse
效果图:

步骤:
1.新建项目,新建GetNumber.class 类,用来获取通讯录中的信息
package com.yanis.getmyphonenumber;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.provider.ContactsContract.CommonDataKinds.Phone;public class GetNumber {  public static List<PhoneInfo> lists = new ArrayList<PhoneInfo>();  public static String getNumber(Context context) {
Cursor cursor = context.getContentResolver().query(Phone.CONTENT_URI,        null, null, null, null);
String phoneNumber;
String phoneName;    while (cursor.moveToNext()) {
phoneNumber = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));//电话号码
phoneName = cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME));//姓名
PhoneInfo info = new PhoneInfo(phoneName, phoneNumber);
lists.add(info);
System.out.println(phoneName+phoneNumber);
}    return null;
}
}
2.添加权限
<!-- 读取联系人权限 --> <uses-permission android:name="android.permission.READ_CONTACTS"/>
3.新建PhoneInfo.class 类作为通讯录信息封装类
package com.yanis.getmyphonenumber;/**
*
* @author yechao
* @说明 通讯录信息封装类 */public class PhoneInfo {  private String phoneName;  private String phoneNumber;  public PhoneInfo(String phoneName, String phoneNumber) {
setPhoneName(phoneName);
setPhoneNumber(phoneNumber);
}  public String getPhoneName() {    return phoneName;
}  public void setPhoneName(String phoneName) {    this.phoneName = phoneName;
}  public String getPhoneNumber() {    return phoneNumber;
}  public void setPhoneNumber(String phoneNumber) {    this.phoneNumber = phoneNumber;
}
}
4.自定义 ListView 的适配器类 MyAdapter.class
package com.yanis.getmyphonenumber;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.LinearLayout;import android.widget.TextView;public class MyAdapter extends BaseAdapter {  private List<PhoneInfo> lists;  private Context context;//承接上下文
public MyAdapter(List<PhoneInfo> lists,Context context)
{    this.lists = lists;    this.context = context;
}
//返回集合的数量  @Override  public int getCount() {    return lists.size();
}  //返回当前数据  @Override  public Object getItem(int position) {    return lists.get(position);
}  //获取当前ID  @Override  public long getItemId(int position) {    return position;
}  //返回当前视图  @Override  public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder ;    if(convertView==null)
{
convertView = LayoutInflater.from(context).inflate(R.layout.call,null);
holder = new ViewHolder();
holder.tvName = (TextView)convertView.findViewById(R.id.tv_Name);
holder.tvNumber = (TextView)convertView.findViewById(R.id.tv_Number);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
holder.tvName.setText(lists.get(position).getPhoneName());
holder.tvNumber.setText(lists.get(position).getPhoneNumber());    return convertView;
}
private static class ViewHolder{
TextView tvName;
TextView tvNumber;
}
}
5.最后就是主界面代码,至于布局太简单就不列出来了,有兴趣的童鞋可以查看源代码package com.yanis.getmyphonenumber;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;public class MainActivity extends Activity { private ListView listView; private MyAdapter adapter;
@Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GetNumber.getNumber(this);
initView();
}  private void initView() {
listView =(ListView) findViewById(R.id.listView);
adapter = new MyAdapter(GetNumber.lists, this);
listView.setAdapter(adapter);
}
}
‘肆’ 求Android通讯录备份源代码,
eoe上面有,需要的留下方式
‘伍’ android 通讯录 怎么改联系人
通过getContentResolver()得到ContentResolver
后,我们就可以通过该对象的delete,insert,updata,query等方法间接操作联系人数据库,那么,如果我们删除某些联系人,以ContactsContract.RawContacts.CONTENT_URI为例,怎么做,先来看下源码:
首先,ContentResolver调用delete();删除操作从红色部分开始
@Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        waitForAccess();
        return super.delete(uri, selection, selectionArgs);
    }
上面的super.delete(uri, selection, selectionArgs)调用父亲方法
@Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int count = 0;
        boolean applyingBatch = applyingBatch();
        if (!applyingBatch) {
            mDb = mOpenHelper.getWritableDatabase();
            mDb.beginTransactionWithListener(this);
            try {
                count = deleteInTransaction(uri, selection, selectionArgs);
                if (count > 0) {
                    mNotifyChange = true;
                }
                mDb.setTransactionSuccessful();
            } finally {
                mDb.endTransaction();
            }
            onEndTransaction();
        } else {
            count = deleteInTransaction(uri, selection, selectionArgs);
            if (count > 0) {
                mNotifyChange = true;
            }
        }
        return count;
    }
父类回调deleteInTransaction(uri, selection, selectionArgs);删除联系人操作在这里进行。
//该方法对uri进行匹配来执行相应的删除操作,并且是在事务中完成的,,比如
//content://com.android.contacts/contacts
//content://com.android.contacts/contacts/#
// .......................................................省略
@Override
    protected int deleteInTransaction(Uri uri, String selection, String[] selectionArgs) {
           .......................................................
           .......................................................
         //我们可以在uri中的authority部分可带可选的参数ContactsContract.CALLER_IS_SYNCADAPTER
        //比如uri字符串可以写成content://com.android.contacts?ContactsContract.CALLER_IS_SYNCADAPTER=true
        // ContactsContract.CALLER_IS_SYNCADAPTER默认是false的,他告诉同步适配器如何执行删除操作。
       //如果设置为true,则delete的时候直接删除联系人,否则,默认delete时是不会立即删除RawContacts中的数据的,
       //只是把RawContacts.DELETED标志位设置为1,从它的aggregate contact中移除该raw contact,即显示联系人时不显示它的内容
        //同步联系人时,删除服务器上的raw contact,最终删除手机上已
       //标记为DELETED为1的raw contacts
        final boolean callerIsSyncAdapter = readBooleanQueryParameter(uri, ContactsContract.CALLER_IS_SYNCADAPTER, false);
        final int match = sUriMatcher.match(uri);
        switch (match) {
           .......................................................
           .......................................................
           .......................................................
            case CONTACTS: {//uri为content://com.android.contacts/contacts,目录(dir)类型
                // TODO
                return 0;
            }
            case CONTACTS_ID: {//删除某一个联系人,uri指定了ContactsContract.Contacts中的字段contact_id,Item类型
                long contactId = ContentUris.parseId(uri);//得到该给定联系人数据集的id
                return deleteContact(contactId);
            }
           .......................................................
           .......................................................
           .......................................................
            case RAW_CONTACTS: {
                int numDeletes = 0;
                Cursor c = mDb.query(Tables.RAW_CONTACTS, new String[]{RawContacts._ID},
                        appendAccountToSelection(uri, selection), selectionArgs, null, null, null);
                try {
                    while (c.moveToNext()) {
                        final long rawContactId = c.getLong(0);
                        numDeletes += deleteRawContact(rawContactId, callerIsSyncAdapter);
                    }
                } finally {
                    c.close();
                }
                return numDeletes;
            }
            case RAW_CONTACTS_ID: {
                final long rawContactId = ContentUris.parseId(uri);
                return deleteRawContact(rawContactId, callerIsSyncAdapter);
            }
            case DATA: {
                mSyncToNetwork |= !callerIsSyncAdapter;
                return deleteData(appendAccountToSelection(uri, selection), selectionArgs,
                        callerIsSyncAdapter);
            }
            case DATA_ID:
            case PHONES_ID:
            case EMAILS_ID:
            case POSTALS_ID: {
                long dataId = ContentUris.parseId(uri);
                mSyncToNetwork |= !callerIsSyncAdapter;
                return deleteData(Data._ID + "=" + dataId, null, callerIsSyncAdapter);
            }
           .......................................................
           .......................................................
           .......................................................
        }
    }
public int deleteRawContact(long rawContactId, boolean callerIsSyncAdapter) {
        if (callerIsSyncAdapter) {
            mDb.delete(Tables.PRESENCE, PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null);
            //直接删除数据
            return mDb.delete(Tables.RAW_CONTACTS, RawContacts._ID + "=" + rawContactId, null);
        } else {
            //从他关联的aggregate contact移除该数据
            mDbHelper.removeContactIfSingleton(rawContactId);
            //标记为已删除,但不是立即删除数据
            return markRawContactAsDeleted(rawContactId);
        }
    }
综上,我们要删除联系人可以这样做:
1)删除单个联系人:
CR.delete(ContactsContract.RawContacts.CONTENT_URI,ContactsContract.RawContacts_id + "=" + delRawId);
2)删除全部联系人:
getContentResolver().delete(Uri.parse(ContactsContract.RawContacts.CONTENT_URI.toString() +"?" + ContactsContract.CALLER_IS_SYNCADAPTER+"=true"), ContactsContract.RawContacts._ID + ">0", null));
数据索引从1开始,所以只要id>0就可以全部删除raw contact记录,上面的删除操作是立即进行的,因为我们设置了true.
‘陆’ 为什么我在eclipse导入Android自带通讯录源码有那么多错误,好像是缺少几个包,求解
没装ANDROID SDK吧。。。
http://apps.hi..com/share/detail/34638353下面有完整教材和下载,希望采纳
联系人保存位置及文件名:/data/data/com.providers.contacts/databases/contacts2.db
‘捌’ 安卓通讯录的开发代码
直接拿 android 源代码里的 phone 包就可以
IplImage* cameraImage = NULL;
    while ((cameraImage = cvQueryFrame(capture)) != NULL)
    {
        cvShowImage("Camera",cameraImage);
        cvWaitKey(1);
    }
