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

转载自:http://blog.csdn.net/mdf_jy/article/details/55001909
1. 用隐式Intent获取联系人

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

   <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>  


    第二步采用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一样的

    <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>


   第二步 得到内容访问者

     ContentResolver cr=getContentResolver();   

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

 List<String> namelist=new ArrayList<>();
    List<String> 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<Map<String,Object>> date=new ArrayList<>();
        for (int i = 0; i <namelist.size() ; i++) {
            Map<String,Object> 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<String> namelist=new ArrayList<>();
    List<String> 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<Map<String,Object>> date=new ArrayList<>();
        for (int i = 0; i <namelist.size() ; i++) {
            Map<String,Object> 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代码:

<?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_main"     
    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.mdf_android01.android25_contentresolver02.MainActivity">


    <TextView
        android:layout_width="match_parent"
        android:layout_height="30dp"


        >
    </TextView>

    <Button android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ContentProvider获取所有联系人"
        android:onClick="getContacts"
        />

      <Button android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="隐式跳转获取联系人"
        android:id="@+id/bt_main_button"
        />

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lv_main_view"
        >
    </ListView>
</LinearLayout>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值