安卓开发5——利用ContentProvider获取手机联系人

目录

一、实验内容

二、作业过程和结果

三、完整代码


一、实验内容

使用ContentProvider获取手机联系人。

二、作业过程和结果

1、首先在模拟器中添加几个联系人,作为本项目的获取目标。

         

2、本项目包含两个java文件和两个布局文件,如下图。后面会分别介绍这些文件。

          

3、创建主活动ReadContacts,并对应布局activity_read_contacts.xml。布局很简单,就一个按钮和一个ListView。主活动中通过点击事件对联系人进行获取,其中最主要的是授权以及授权通过后的联系人获取,关键代码如下。

             activity_read_contacts.xml布局文件 

          

              点击按钮,创建适配器,并对权限进行判断 

             

               对用户选择的权限进行接收处理 

          

               权限通过后对联系人进行读取 

          

            自定义适配器 

          

4、MyPeople是联系人类,它包含name和number字段和对应属性方法,分别对应联系人的姓名和电话。

           

5、people_info_xml是ListView中每个子项的布局,它包含两个TextView,分别显示联系人姓名和电话号码。在实例化适配器的时候传入该布局。

           

6、最后在AndroidManifest文件中声明权限,如下。

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

7、到此所有步骤完成,运行程序,点击获取联系人按钮,结果如下。

          

三、完整代码

ReadContacts.java

package com.example.lab.getcontacts;

import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Color;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;
import android.Manifest;


public class ReadContacts extends AppCompatActivity {
    //创建一个peopleList用于存储联系人
    public List<MyPeople> peopleList=new ArrayList<>();
    //创建一个适配器,后面将用它把联系人的信息传递给ListView
    PeopleAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_read_contacts);
        Button getContacts=(Button)findViewById(R.id.btn_getContacts);


        getContacts.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                adapter=new PeopleAdapter(ReadContacts.this,R.layout.people_info,peopleList);
                ListView myListView=(ListView)findViewById(R.id.myListView);
                myListView.setAdapter(adapter);
                //判断是否获得权限
                if(ContextCompat.checkSelfPermission(ReadContacts.this, Manifest.permission.READ_CONTACTS)!=PackageManager.PERMISSION_GRANTED){
                    //打开授权对话框
                    ActivityCompat.requestPermissions(ReadContacts.this,new String[]{Manifest.permission.READ_CONTACTS},1);
                }else{
                    readContacts();
                }

            }
        });
    }

    //接收用户授权选择
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch(requestCode)
        {
            case 1:
                if(grantResults.length>0 && grantResults[0]== PackageManager.PERMISSION_GRANTED){
                    readContacts();
                }else{
                    Toast.makeText(this,"你没有获得权限!",Toast.LENGTH_LONG).show();
                }
                break;
            default:
        }
    }

    //读取联系人的方法
    private void readContacts()
    {
        Cursor cursor=null;
        try{
            //查询联系人数据
            cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
            //获得联系人个数
            int count=cursor.getCount();
            //创建MyPeople数组,用于装载每一位联系人
            MyPeople[] myPeoples=new MyPeople[count];
            int i=0;
            if(cursor!=null)
            {
                while(cursor.moveToNext()){
                    String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    //实例化联系人对象
                    myPeoples[i]=new MyPeople();
                    myPeoples[i].setName(name);
                    myPeoples[i].setNumber(number);
                    //将每一个联系人放进peopleList
                    peopleList.add(myPeoples[i]);
                    i++;
                }
                adapter.notifyDataSetChanged();
            }

        }catch(Exception e)
        {
            e.printStackTrace();
        }finally{
            if(cursor!=null)
            {
                cursor.close();
            }
        }
    }

    //自定义一个适配器
    public class PeopleAdapter extends ArrayAdapter<MyPeople>{

        private int resourceID;
        public PeopleAdapter(Context context, int resource, List<MyPeople> objects) {
            super(context, resource, objects);
            resourceID=resource;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            MyPeople myPeople=getItem(position);
            View view= LayoutInflater.from(getContext()).inflate(resourceID,parent,false);
            TextView tvName= (TextView)view.findViewById(R.id.textView_name);
            tvName.setText("姓名:"+myPeople.getName());
            tvName.setTextColor(Color.BLACK);
            TextView tvNumber= (TextView)view.findViewById(R.id.textView_number);
            tvNumber.setText("电话:"+myPeople.getNumber());
            tvNumber.setTextColor(Color.BLACK);
            return view;
        }
    }
}

MyPeople.java

package com.example.lab.getcontacts;

/**
 * Created by Lab on 2018/12/15.
 */

public class MyPeople {
    String name;
    String number;

    public String getName() {
        return name;
    }

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

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

}

猜你喜欢

转载自blog.csdn.net/h2503652646/article/details/85038361