获取本地通讯录--ContentResolver

获取本地通讯录,方法记录

先说一下方法的种类,我现在所知道的有两种方法

1、第一种是比较直接但是相对比较麻烦的方法

手机内部会存有通讯录数据库,我们通过直接访问数据库,去查询所需要的资源。听起来挺方便,但是要知道,这些表很多很多,而且需要表和表之间串联查询,这中间就会有一定的复杂程度。(我连表的名字也记不住~~~)

2、第二种方法就比较符合java的习惯了,有工具类,有实现方法,有已经规定好的字段,接下来的例子就是使用这种方法来实现的

先把权限写在最上方~~

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

权限完成以后

第一步创建一个ContentResolver,并通过构造器获取实体

ContentResolver resolver = getContentResolver();
第二步 通过resolver进行查询

这里具体说一下,android已经规范好了查询通讯录的字段,字段一共有其实几个,我们只需要获取我们所需要的字段。这些字段已经在Phone这个类里定义好了

Cursor cursor = resolver.query(Phone.CONTENT_URI, new String[]{Phone.DISPLAY_NAME, Phone.NUMBER}, null, null, null);
然后就是数据提取的工作,也很简单

我先写了一个类来存放数据,就两个变量,构造方法我这里就不贴了

public class ContactData {
    private String name;
    private long phoneNumber;
然后是提取到一个ArrayList里面

if (cursor != null) {
            while (cursor.moveToNext()) {
                ContactData contactData = new ContactData(
                        cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME)),
                        cursor.getLong(cursor.getColumnIndex(Phone.NUMBER)));
                data.add(contactData);
            }
            cursor.close();
            return data;
        }else {
            Toast.makeText(this,"No Contact Data", Toast.LENGTH_SHORT).show();
            return null;
        }
我的源码里是对list进行函数封装的,所以会返回一个arraylist

然后就是listview的一系列操作,我就不解释啦  之前写过很详细代码示例。

接下来就是源码

首先是AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ty.contact_demo1">

    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

接下来是Main和listview item的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context="com.ty.contact_demo1.MainActivity">

    <ListView
        android:id="@+id/LV_Main_ContactListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </ListView>
</RelativeLayout>
item

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:id="@+id/TV_Item_Name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/TV_Item_PhoneNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/TV_Item_Name"
        android:textSize="18sp" />
</RelativeLayout>




再来是Listview和Contactdata(存放数据的类)

ListView

package com.ty.contact_demo1;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by IT on 2017/2/22.
 */

public class Contact_ListView_BaseAdapter extends BaseAdapter {

    private ArrayList<ContactData> dataList;
    private Context context;
    private ViewHolder viewHolder;

    public Contact_ListView_BaseAdapter(ArrayList<ContactData> dataList, Context context) {
        this.dataList = dataList;
        this.context = context;
    }

    @Override
    public int getCount() {
        return dataList.size();
    }

    @Override
    public Object getItem(int position) {
        return dataList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        viewHolder = null;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.layout_item, null);
            viewHolder.tv_name = (TextView) convertView.findViewById(R.id.TV_Item_Name);
            viewHolder.tv_phoneNumber = (TextView) convertView.findViewById(R.id.TV_Item_PhoneNumber);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.tv_name.setText(dataList.get(position).getName());
        viewHolder.tv_phoneNumber.setText(String.valueOf(dataList.get(position).getPhoneNumber()));
        return convertView;
    }

    class ViewHolder {
        TextView tv_name;
        TextView tv_phoneNumber;
    }
}
ContactData

package com.ty.contact_demo1;

/**
 * Created by IT on 2017/2/22.
 */

public class ContactData {
    private String name;
    private long phoneNumber;

    public ContactData(String name, long phoneNumber) {
        this.name = name;
        this.phoneNumber = phoneNumber;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(long phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

然后是Main

package com.ty.contact_demo1;

import android.content.ContentResolver;
import android.database.Cursor;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    Contact_ListView_BaseAdapter adapter;
    ArrayList<ContactData> dataList;
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView) findViewById(R.id.LV_Main_ContactListView);
        dataList = GetContactData();
        if (dataList != null)
        {
            adapter = new Contact_ListView_BaseAdapter(dataList,this);
            listView.setAdapter(adapter);
        }
    }

    private ArrayList<ContactData> GetContactData() {
        ContentResolver resolver = getContentResolver();
        ArrayList<ContactData> data = new ArrayList<>();
        Cursor cursor = resolver.query(Phone.CONTENT_URI, new String[]{Phone.DISPLAY_NAME, Phone.NUMBER}, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                ContactData contactData = new ContactData(
                        cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME)),
                        cursor.getLong(cursor.getColumnIndex(Phone.NUMBER)));
                data.add(contactData);
            }
            cursor.close();
            return data;
        }else {
            Toast.makeText(this,"No Contact Data", Toast.LENGTH_SHORT).show();
            return null;
        }
    }
}


最后在补充一个点击ListView的Item,可以拨打电话的方法

首先要加一条拨打电话的权限

<uses-permission android:name="android.permission.CALL_PHONE" />
然后就是调用listview的setOnItemClickListener方法

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(Intent.ACTION_CALL);
                intent.setData(Uri.parse("tel:"+((ContactData)adapter.getItem(position)).getPhoneNumber()));
                startActivity(intent);
            }
        });
这里会发现startActivity(intent)会有一个警告

说需要检查权限,我这里先略过(我还不太了解哈),之后会补上专题我保证(爱信不信,千万别信)


好了   很简单吧  感觉这样列举出来的实例方便查看,之前的一些博客我也会慢慢的修改一下,今天就到这里吧











  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安卓开发获取手机通讯录信息可以通过ContentResolver和Cursor实现。具体步骤如下: 1.在AndroidManifest.xml文件中添加获取通讯录权限 2.创建ContentResolver对象 3.创建Cursor对象,使用ContentResolver的query()方法查询通讯录数据 4.遍历Cursor对象,获取通讯录数据 下面是一个示例代码: ``` if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { //permission not granted, request for permission ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, PERMISSION_READ_CONTACTS); }else { //permission granted, read contacts readContacts(); } private void readContacts() { ContentResolver contentResolver = getContentResolver(); Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { do { //获取联系人姓名 String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); //获取联系人电话号码 Cursor phoneCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + cursor.getString( cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)), null, null); if (phoneCursor != null && phoneCursor.moveToFirst()) { do { String phone = phoneCursor.getString(phoneCursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER)); //处理联系人姓名和电话号码数据 } while (phoneCursor.moveToNext()); phoneCursor.close(); } } while (cursor.moveToNext()); cursor.close(); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值