首页 > 程序开发 > 移动开发 > 其他 >

ContentProvider与隐式Intent获取手机联系人通讯录信息或电话的方法

2017-02-14

ContentProvider与隐式Intent获取手机联系人通讯录信息或电话的方法,第一步、在需要读取或者修改联系人信息的前要在manifests文件下声明读写权限,否则在后续的调用中会出错,第二步采用ACTION_PICK为动作声明一个隐式Intent。

1. 用隐式Intent获取联系人

第一步、在需要读取或者修改联系人信息的前要在manifests文件下声明读写权限,否则在后续的调用中会出错

第二步采用ACTION_PICK为动作声明一个隐式Intent。

bt_main_button = (Button) findViewById(R.id.bt_main_button);

bt_main_button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent i = new Intent(Intent.ACTION_PICK,

ContactsContract.Contacts.CONTENT_URI); //声明隐式Intent,从联系人中获取一个返回信息

startActivityForResult(i,RESULT_CANCELED);

}

});

第三步、在onActivityResult中获取返回的URI,该URI是指向用户所选的联系人的定位符,通过该URI可以查询联系人数据库从而提取出联系人id与姓名。而通过联系人id可以进一步在数据库中提取出联系人的电话。其中联系人名字和id要在ContactsContract.Contacts中获取,而电话则ContactsContract.CommonDataKinds.Phone中获取。

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == RESULT_CANCELED){

Uri contactUri = data.getData(); //该数据URI是一个指向用户所选联系人的

定位符

Cursor c =getContentResolver().query(contactUri, null, null, null, null); //查询联

系人数据库,获得一个可用的Cursor

if(c.moveToFirst()) { //将Cursor移动到第一条记录

String suspect = c.getString(c.getColumnIndex

(ContactsContract.Contacts.DISPLAY_NAME)); //通过Cursor c获得联系人名字

String id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));

//通过Cursor c获得联系人id

Cursor c2 =getContentResolver().query

(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,

ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null);

//在ContactsContract.CommonDataKinds.Phone.CONTENT_URI里,

// 通过上面获得的联系人id获得一个新的Cursor c2

c2.moveToFirst();

String phonenum = c2.getString(c2.getColumnIndex

(ContactsContract.CommonDataKinds.Phone.NUMBER)); //通过Cursor c2获得联系人电

//给控件赋值

tv_main_view.setText(suspect+" "+phonenum);

c2.close(); //关闭Cursor c2

c.close(); //关闭Cursor c

}

}

}

2. 通过ContentProvider得到手机上所有联系人的信息

第一步 在manifests文件下声明读写权限 与隐式intent一样的

第二步 得到内容访问者

ContentResolver cr=getContentResolver();

第三步 得到手机中所有的联系人的信息并展示在listview中 并得到你选中的联系人信息展示在Testview中

List namelist=new ArrayList<>();

List tellist=new ArrayList<>();

//ContentProvider得到所有联系的信息

public void getContacts(View view){

//获取联系人

Uri uri=Uri.parse("content://com.android.contacts/raw_contacts");

Cursor cursor= cr.query(uri,null,null,null,null);

while(cursor.moveToNext()){

//得到联系人是id

int id=cursor.getInt(cursor.getColumnIndex("_id"));

String name=cursor.getString(cursor.getColumnIndex("display_name"));

// Log.i("text", "getContacts: "+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)){

namelist.add(name);

tellist.add(data1);

}

}

}

List> date=new ArrayList<>();

for (int i = 0; i map=new HashMap<>();

map.put("name",namelist.get(i));

map.put("tel",tellist.get(i));

date.add(map);

}

SimpleAdapter adpater=new SimpleAdapter(this,date,R.layout.item_list,new String[]

{"name","tel"},new int[]{R.id.tv_list_name,R.id.tv_list_apont} );

lv_main_view.setAdapter(adpater);

lv_main_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView parent, View view, int position, long id) {

tv_main_view.setText(namelist.get(position)+" "+tellist.get(position));

}

});

}

两种方式结合源代码:

java代码:

import android.content.ContentResolver;

import android.content.Intent;

import android.net.Uri;

import android.provider.ContactsContract;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.database.Cursor;

import android.widget.Adapter;

import android.widget.AdapterView;

import android.widget.Button;

import android.widget.ListView;

import android.widget.SimpleAdapter;

import android.widget.TextView;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

public class MainActivity extends AppCompatActivity {

private ContentResolver cr;

List namelist=new ArrayList<>();

List tellist=new ArrayList<>();

private ListView lv_main_view;

private TextView tv_main_view;

private Button bt_main_button;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

lv_main_view = (ListView) findViewById(R.id.lv_main_view);

tv_main_view = (TextView) findViewById(R.id.tv_main_view);

bt_main_button = (Button) findViewById(R.id.bt_main_button);

bt_main_button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent i = new Intent(Intent.ACTION_PICK,

ContactsContract.Contacts.CONTENT_URI); //声明隐式Intent,从联系人中获取一个返回信息

startActivityForResult(i,RESULT_CANCELED);

}

});

cr = getContentResolver();

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == RESULT_CANCELED){

Uri contactUri = data.getData(); //该数据URI是一个指向用户所选联系人的

定位符

Cursor c =getContentResolver().query(contactUri, null, null, null, null); //查询联

系人数据库,获得一个可用的Cursor

if(c.moveToFirst()) { //将Cursor移动到第一条记录

String suspect = c.getString(c.getColumnIndex

(ContactsContract.Contacts.DISPLAY_NAME)); //通过Cursor c获得联系人名字

String id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));

//通过Cursor c获得联系人id

Cursor c2 =getContentResolver().query

(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,

ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null);

//在ContactsContract.CommonDataKinds.Phone.CONTENT_URI里,

// 通过上面获得的联系人id获得一个新的Cursor c2

c2.moveToFirst();

String phonenum = c2.getString(c2.getColumnIndex

(ContactsContract.CommonDataKinds.Phone.NUMBER)); //通过Cursor c2获得联系人电

//给控件赋值

tv_main_view.setText(suspect+" "+phonenum);

c2.close(); //关闭Cursor c2

c.close(); //关闭Cursor c

}

}

}

public void getContacts(View view){

//获取联系人

Uri uri=Uri.parse("content://com.android.contacts/raw_contacts");

Cursor cursor= cr.query(uri,null,null,null,null);

while(cursor.moveToNext()){

//得到联系人是id

int id=cursor.getInt(cursor.getColumnIndex("_id"));

String name=cursor.getString(cursor.getColumnIndex("display_name"));

// Log.i("text", "getContacts: "+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)){

namelist.add(name);

tellist.add(data1);

}

}

}

List> date=new ArrayList<>();

for (int i = 0; i map=new HashMap<>();

map.put("name",namelist.get(i));

map.put("tel",tellist.get(i));

date.add(map);

}

SimpleAdapter adpater=new SimpleAdapter(this,date,R.layout.item_list,new String[]

{"name","tel"},new int[]{R.id.tv_list_name,R.id.tv_list_apont} );

lv_main_view.setAdapter(adpater);

lv_main_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView parent, View view, int position, long id) {

tv_main_view.setText(namelist.get(position)+" "+tellist.get(position));

}

});

}

xml代码:

真机效果图:

这里写图片描述
这里写图片描述
相关文章
最新文章
热点推荐