当前位置:首页 » 操作系统 » 安卓源码通讯录

安卓源码通讯录

发布时间: 2022-07-31 03:43:03

‘壹’ 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 包就可以

‘玖’ 手机通讯录管理中拨号的源代码c语言编程

IplImage* cameraImage = NULL;
while ((cameraImage = cvQueryFrame(capture)) != NULL)
{
cvShowImage("Camera",cameraImage);
cvWaitKey(1);
}

热点内容
md5加密后的密码是什么意思 发布:2025-01-18 15:50:16 浏览:192
如何qq空间访问权限 发布:2025-01-18 15:49:30 浏览:531
matlab遗传算法约束 发布:2025-01-18 15:31:33 浏览:909
果冻java 发布:2025-01-18 15:25:59 浏览:695
电脑与时间服务器同步间隔 发布:2025-01-18 15:21:28 浏览:54
苹果手机apple登录密码在手机哪里 发布:2025-01-18 15:13:43 浏览:380
吃鸡去哪里下手游安卓 发布:2025-01-18 15:10:59 浏览:668
东方财富dk指标源码 发布:2025-01-18 14:45:53 浏览:435
陌陌登陆密码是什么 发布:2025-01-18 14:36:54 浏览:848
海龟编译器代码 发布:2025-01-18 14:16:51 浏览:34