1.通讯录
- 通讯录以数据库的形式存储在手机中
- ContactsContract.CommonDataKinds.Phone.NUMBER和ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME分别是字段名
- Manifest文件中写入权限
- 在主activity中请求权限
- 获取请求权限后接受onRequestPermissionsResult回调,来进行业务逻辑
需要在
1、创建业务逻辑类GetNumber
package com.fengray.ex039contacts;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.util.Log;
import android.widget.Toast;
public class GetNumber {
public static String getNumber(Context context){
//通讯录以数据库的形式存储在手机中,需要从数据库中获得结果集
Cursor cursor= context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
//创建用来接受电话号码和姓名
String phonenumber,phoneName;
//循环读取数据库的记录
while (cursor.moveToNext()){
//根据记录集的索引来取值
phonenumber=cursor.getString(cursor.getColumnIndex((ContactsContract.CommonDataKinds.Phone.NUMBER)));
phoneName=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
Log.d("JIAN", phoneName+":"+phonenumber);
}
return null;
}
}
2、Manifest文件中写入权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
3、主activity
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//回调方法,无论哪种结果,最终都会回调该方法,之后在判断用户是否授权,
// 用户同意则调用 GetNumber.getNumber()方法,失败则会弹窗提示失败
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1005:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
GetNumber.getNumber(this);
} else {
Toast.makeText(this, "获取联系人权限失败", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取手机通讯录读取权限
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_CONTACTS//通话录
}, 1005);
}
}
打印:
2020-08-11 16:07:47.950 13791-13791/com.fengray.ex039contacts D/JIAN: 王五:1 381-698-4258
2020-08-11 16:07:47.950 13791-13791/com.fengray.ex039contacts D/JIAN: 燕小六:1 586-542-5481
2020-08-11 16:07:47.951 13791-13791/com.fengray.ex039contacts D/JIAN: 李四:1 856-657-8587
2020-08-11 16:07:47.951 13791-13791/com.fengray.ex039contacts D/JIAN: 张三:1 861-485-2458
2.封装模型及优化
文件结构
- 1、GetNumber:数据模型加载
- 2、PhoneInfo:数据模型
- 3、MyAdapter:自定义适配器
- 4、MainActivity:程序入口
- 5、cell.xml:自定义布局
- 6、main.xml:主布局
1、GetNumber:
package com.fengray.ex039contacts;
import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class GetNumber {
//创建一个电话号码的集合
public static List<PhoneInfo> lists=new ArrayList<PhoneInfo>();
//创建获取电话号码的类方法
public static String getNumber(Context context){
//创建结果集
Cursor cursor= context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
//字符串姓名和号码
String phonenumber,phoneName;
while (cursor.moveToNext()){
phonenumber=cursor.getString(cursor.getColumnIndex((ContactsContract.CommonDataKinds.Phone.NUMBER)));
phoneName=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//创建数据模型
PhoneInfo modelPhoneInfo=new PhoneInfo(phoneName, phonenumber);
lists.add(modelPhoneInfo);
Log.d("JIAN", modelPhoneInfo.getName()+":"+modelPhoneInfo.getPhoneNumber());
}
return null;
}
}
2、PhoneInfo:
package com.fengray.ex039contacts;
public class PhoneInfo {
private String name;
private String phoneNumber;
public PhoneInfo(String name, String phoneNumber) {
this.name = name;
this.phoneNumber = phoneNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
3、MyAdapter
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.List;
public class MyAdapter extends BaseAdapter {
private List<PhoneInfo> phoneInfoLists;
private Context context;
//创建一个布局文件,因为要作为参数被引用,上同
private LinearLayout linearLayout;
public MyAdapter(List<PhoneInfo> phoneInfoLists, Context context) {
this.phoneInfoLists = phoneInfoLists;
this.context = context;
}
@Override
public int getCount() {
return phoneInfoLists.size();
}
@Override
public Object getItem(int position) {
return phoneInfoLists.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//加载linnearLayout,从上下文中获取布局转换器
// LayoutInflater inflater=LayoutInflater.from(context);
// //用转换器从layout布局文件中读取布局,别忘了强转
// linearLayout=(LinearLayout) inflater.inflate(R.layout.cell,null);
//
// //获取布局文件中的控件
// TextView phoneName=linearLayout.findViewById(R.id.phoneName);
// TextView phoneNumber=linearLayout.findViewById(R.id.phoneNumber);
// //从集合中抽取模型对象,并读取对象中的属性
// phoneName.setText(phoneInfoLists.get(position).getName());
// phoneNumber.setText(phoneInfoLists.get(position).getPhoneNumber());
//Log.d("JIAN", "getView: "+phoneInfoLists.get(position).getName());
ViewHolder viewHolder;
if (convertView==null){
convertView=LayoutInflater.from(context).inflate(R.layout.cell, null);
viewHolder=new ViewHolder();
viewHolder.nametv=convertView.findViewById(R.id.phoneName);
viewHolder.numbertv=convertView.findViewById(R.id.phoneNumber);
viewHolder.nametv.setText(phoneInfoLists.get(position).getName());
viewHolder.numbertv.setText(phoneInfoLists.get(position).getPhoneNumber());
//存储一下covertView的标签
convertView.setTag(viewHolder);
}else {
viewHolder=(ViewHolder) convertView.getTag();
viewHolder.nametv.setText(phoneInfoLists.get(position).getName());
viewHolder.numbertv.setText(phoneInfoLists.get(position).getPhoneNumber());
}
return convertView;
}
private static class ViewHolder{
TextView nametv;
TextView numbertv;
}
}
4、MainActivity
package com.fengray.ex039contacts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private ListView lv;
//需要是用adpter适配
private MyAdapter adapter;
//回调方法,无论哪种结果,最终都会回调该方法,之后在判断用户是否授权,
// 用户同意则调用 GetNumber.getNumber()方法,失败则会弹窗提示失败
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1005:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
GetNumber.getNumber(this);
readList();
} else {
Toast.makeText(this, "获取联系人权限失败", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取手机通讯录读取权限
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_CONTACTS//通话录
}, 1005);
}
public void readList(){
//获取list控件
lv=findViewById(R.id.phoneList);
//创建adapter适配器
adapter=new MyAdapter(GetNumber.lists,this);//传入集合(联系人数据集合)
//将list控件设置适配器
lv.setAdapter(adapter);
}
}
manifest
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>