联系人的姓名和号码是保存在不同的表中,不要一下子把号码查询来,我开始就是把姓名和电话同时查询出来的,导致系统非常的慢
关键代码:
1, 使用javabean操作存储读取到的数据
package com.example.bean;
/**
*
* @author Administrator 联系人的个人信息
*/
public class OneUser {
private String id;
private String username;
private String userphone;
private String useremail;
private String userbmp;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserphone() {
return userphone;
}
public void setUserphone(String userphone) {
this.userphone = userphone;
}
public String getUseremail() {
return useremail;
}
public void setUseremail(String useremail) {
this.useremail = useremail;
}
public String getUserbmp() {
return userbmp;
}
public void setUserbmp(String userbmp) {
this.userbmp = userbmp;
}
}
2, 查询用户的id和姓名
// 参数一:uridate表示查询的数据uri projection是我们要查询的列; table是根据Uri确定的数据库表;
//
// selection使我们自己的查询条件; order是我们想要的排序方式。
// RawContacts.CONTENT_URI读取表的所有的姓名
Cursor cursor = fragmentActivity.getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI, null, null, null,
ContactsContract.Data.SORT_KEY_PRIMARY);// ContactsContract.Contacts.DISPLAY_NAME
// +"ASC"
while (cursor.moveToNext()) {
OneUser user = new OneUser();
// 查询id和名字
user.setId(cursor.getString(cursor
.getColumnIndex(ContactsContract.Contacts._ID)));
user.setUsername(cursor.getString(cursor
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
mItems.add(user);使用队列存放
}
cursor.close();//关闭游标
3,用户点击时,查询点击的号码
@Override
// 监听按下的当点击时,查询出用户的id
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(fragmentActivity, "position:" +"view:"+view+ position + "id:" + id,
Toast.LENGTH_SHORT).show();
//根据队列中的存放的id查询用户的电话
OneUser oneUser=mItems.get(position);
//获取联系人表中的提供者,根据id查询
Cursor phones = fragmentActivity.getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " =" + oneUser.getId(), null, null);
// 指向phones的下一条数据
if(phones.moveToFirst()) {
// 查询数据号码
userphone = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
System.out.println("userphone:"+userphone);
}
phones.close();
4, 添加联系人 姓名,号码,邮箱
/**
*
* @author Administrator 添加联系人
*/
public class AddActivity extends Activity {
private EditText useremails;
private EditText usernames;
private EditText userphones;
private ImageView userbmp;
private String username;
private String userphone;
private String useremail;
private ContentResolver resolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.addcontact);
// 获得姓名 ,号码,邮箱,图片
usernames = (EditText) this.findViewById(R.id.username);
userphones = (EditText) this.findViewById(R.id.userphone);
useremails = (EditText) this.findViewById(R.id.useremail);
userbmp = (ImageView) this.findViewById(R.id.bmp);
try {
//读取Assets文件下的资源图片,必须使用流进行读取
InputStream is = this.getResources().getAssets().open("img_1.jpg");
//根据读取的长度创建字节数据
byte[] data = new byte[is.available()];
//读取字节
is.read(data);
// 获得bmp图片工厂
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
//设置如片
userbmp.setImageBitmap(bmp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Animation a = AnimationUtils.loadAnimation(this, R.anim.snap_bottom_in);
// //从底端弹出动画
// Animation b = AnimationUtils.loadAnimation(this,
// R.anim.snap_bottom_out);//从底端消失动画
// menu.startAnimation(a);//弹出菜单
// menu.startAnimation(b);//取消菜单
// 按钮监听器
public void click(View v) {
switch (v.getId()) {
case R.id.cancel:// 取消
finish();//关闭Activity
this.overridePendingTransition(R.anim.activity_close, 0);//设置关闭动画
break;
case R.id.confirm:// 确定
//读取姓名,号码,邮箱
username = usernames.getText().toString().trim();
userphone = userphones.getText().toString().trim();
useremail = useremails.getText().toString().trim();
// 获得内容提供者
resolver = this.getContentResolver();
// 通过Uri访问
// Uri uri = Uri.parse("content://com.MyContent.provider/user");
// 将数据封装成ContentValues对象
ContentValues values = new ContentValues();
// 使用内容提供者插入数据
// 参数一:内容提供者的路径
// 参数二:插入的数据 k:字段名 v:k键的数据
Uri rawContactsUri = resolver.insert(RawContacts.CONTENT_URI,
values);
// 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
// 这时后面插入data表的依据,只有执行空值插入,才能使插入的联系人在通讯录里面可见
// URI:RawContacts.CONTENT_URI
Long contentId = ContentUris.parseId(rawContactsUri);
// 插入姓名
DataInsert(contentId, values);
break;
}
}
// 插入姓名,电话,邮箱 的方法
public void DataInsert(Long contentId, ContentValues values) {
// 通过得到的id 将姓名,电话,邮箱 插入到系统表中
// android.provider.ContactsContract.Data.CONTENT_URI
// 姓名;
values.clear();
// 参数一: 数据要插入的id 参数二:插入一个空的数据返回的id
values.put(Data.RAW_CONTACT_ID, contentId);
// 参数一:数据类型 参数二;数据类型的值
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
// 参数一:名字 参数二;名字:名字
values.put(StructuredName.GIVEN_NAME, username);
//插入姓名
Uri uri = resolver.insert(ContactsContract.Data.CONTENT_URI, values);
if (uri != null) {
Toast.makeText(this, "添加成功..", Toast.LENGTH_SHORT).show();
// 姓名插入成功就查电话号码;
// 清除values的数据
values.clear();
// 联系人id
values.put(Data.RAW_CONTACT_ID, contentId);
// 数据类型
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
// 电话号码
values.put(Phone.NUMBER, userphone);
// 电话号码的类型
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
//插入号码
uri = resolver.insert(ContactsContract.Data.CONTENT_URI, values);
if (uri != null) {
if ("".equals(useremail)) {
Toast.makeText(this, "添加成功..", Toast.LENGTH_SHORT).show();
finish();
this.overridePendingTransition(R.anim.activity_close, 0);
} else {
//清除
values.clear();
//联系人的id
values.put(Data.RAW_CONTACT_ID, contentId);
//数据类型是邮箱
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
//邮箱
values.put(Email.DATA,useremail );
//邮箱数据类型
values.put(Email.TYPE, Email.TYPE_WORK);
//插入邮箱
uri=resolver.insert(ContactsContract.Data.CONTENT_URI, values);
if(uri!=null){
Toast.makeText(this, "添加成功..", Toast.LENGTH_SHORT).show();
finish();
this.overridePendingTransition(R.anim.activity_close, 0);
}else{
Toast.makeText(this, "添加失败..邮箱", Toast.LENGTH_SHORT).show();
}
}
} else {
Toast.makeText(this, "添加失败..电话", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "添加失败..姓名", Toast.LENGTH_SHORT).show();
}
}
读取联系人的号码的步骤;先读取联系人的id和姓名,根据id读取号码,添加联系人 这些操作的前提是都要先获取内容提供者
读取id和号码是在Fargment中操作的需要使用Fragment获取Activity
// 在Fragment中使用ArrayAdapter适配器 必须得到Fragment的Activity
private FragmentActivity fragmentActivity; = getActivity();
//内容提供者
fragmentActivity.getContentResolver().query();
后面将介绍读取联系人的通话记录操作