目录
一、实验内容
使用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;
}
}