内容解析者ContentResolver
使用ContentResolver调用ContentProvider提供的接口,操作数据当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,
可以使用Activity提供的getContentResolver()方法。 ContentResolver 类提供了与ContentProvider类相同签名的四个方法:
public Uri insert(Uri uri, ContentValues values)
该方法用于往ContentProvider添加数据。
public int delete(Uri uri, String selection, String[] selectionArgs)
该方法用于从ContentProvider删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
该方法用于更新ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
该方法用于从ContentProvider中获取数据。
布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main170208"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.example.myapplication.Main170208Activity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取联系人"
android:onClick="getContacts"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转到联系人"
android:onClick="myIntent"/>
</LinearLayout>
<ListView
android:id="@+id/lv_main170208"
android:layout_width="match_parent"
android:layout_height="wrap_content"></ListView>
</LinearLayout>
获取联系人的函数
public void getContacts(View view){
//获取联系人raw_contacts
//id name
Uri uri=Uri.parse("content://com.android.contacts/raw_contacts");
Cursor cursor=cr.query(uri,null,null,null,null);
while (cursor.moveToNext()){
int id=cursor.getInt(cursor.getColumnIndex("_id"));
String name=cursor.getString(cursor.getColumnIndex("display_name"));
Log.i("test",id+" "+name);
//继续获取相对应的联系人的数据(电话号码)
Uri uriData=Uri.parse("content://com.android.contacts/raw_contacts/"+id+"/data");
Cursor cursorData=cr.query(uriData,null,null,null,null);
while(cursorData.moveToNext()){
String data1=cursorData.getString(cursorData.getColumnIndex("data1"));
//int type=cursorData.getInt(cursorData.getColumnIndex("mimetype_id"));
String type=cursorData.getString(cursorData.getColumnIndex("mimetype"));
if("vnd.android.cursor.item/phone_v2".equals(type)){
String s=name+":"+data1;
lists.add(s);
}
}
}
ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1, lists);
listView.setAdapter(adapter);
}
Android跳转到通讯录获取用户名称和手机号码
思路:
1.点击跳转到通讯录界面2.获取通讯录姓名和手机号码
3.回调显示姓名和手机号码
1首先是跳转到通讯录界面
Uri uri=Uri.parse("content://contacts/people");
Intent intent=new Intent(Intent.ACTION_PICK,uri);
startActivityForResult(intent,0);
/**
* 回调函数
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 0:
if(data==null)
{
return;
}
//处理返回的data,获取选择的联系人信息
Uri uri=data.getData();
String[] contacts=getPhoneContacts(uri);
String s=contacts[0]+":"+contacts[1];
lists.clear();
lists.add(s);
ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1, lists);
listView.setAdapter(adapter);
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
其中getPhoneContacts(uri)方法,因为手机的联系人和手机号并不再同一个数据库中,所以我们需要分别做处理
private String[] getPhoneContacts(Uri uri){
String[] contact=new String[2];
//得到ContentResolver对象
ContentResolver cr = getContentResolver();
//取得电话本中开始一项的光标
Cursor cursor=cr.query(uri,null,null,null,null);
if(cursor!=null)
{
cursor.moveToFirst();
//取得联系人姓名
int nameFieldColumnIndex=cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
contact[0]=cursor.getString(nameFieldColumnIndex);
//取得电话号码
String ContactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + ContactId, null, null);
if(phone != null){
phone.moveToFirst();
contact[1] = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
phone.close();
cursor.close();
}
else
{
return null;
}
return contact;
}
3.别忘了加权限
<!--添加联系人的权限-->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>