Android读取系统联系人
2021-06-30 本文已影响0人
浅_若清风
一.获取控件实例,配置适配器
//声明
ArrayAdapter<String> adapter;
List<String> contactsList = new ArrayList<>();
//配置适配器
ListView contactsView = findViewById(R.id.contentacts_view);
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,contactsList);
contactsView.setAdapter(adapter);
其中simple_list_item_1(单行显示)是ListView里自带的一种布局样式,只有一个TextView,你可以根据自身需求使用其它样式。
二.权限添加及检测
READ_CONTACTS是Android的一项危险权限。在Android6.0以及更高版本上,在使用危险权限时都必须进行运行时权限处理。所以,首先使用ContextCompat.checkSelfPermission()检测是否已经授权,checkSelfPermission()方法接收两个参数,第一个参数为上下文Context,第二个参数为具体的权限名,返回值和PackageManager.PERMISSION_GRANTED做比较,相等则表示已授权。如果不相等,使用ActivityCompat.requestPermissions()方法来向用户申请授权,requestPermissions()方法接收三个参数,第一个参数为Activity的实例,第二个为String数组,把需要申请的权限名放入数组即可,第三个为请求码,只需要保证其唯一性即可。
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED)
{
//未授权
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_CONTACTS},1);
}
else
{
//已授权
}
调用完requestPermissions()方法后,无论是否同意,都会回调到onRequestPermissionsResult()方法中,授权结果封装在grantResults参数中,requestCode表示唯一的请求码
//回调
@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
switch (requestCode){
case 1:
if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
//同意请求
}else {
//拒绝请求
}
break;
default:
break;
}
}
三.获取联系人信息
//查询联系人数据
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
使用ContentResolver().query的方法来查询系统的联系人数据,其中第一个参数我们传入ContactsContract.CommonDataKinds.Phone.CONTENT_URI,CONTENT_URI是Uri.parse()方法解析出来的常量结果。遍历Cursor对象,取出我们需要的值
//获取联系人姓名
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//获取联系人手机号
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
//因为我使用的是simple_list_item_1(单行显示),所以需要把结果拼接
contactsList.add(displayName+"\n"+number);
四.完整示例代码
<!--xml布局-->
<!--这里使用ListView,也可使用RecyclerView-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/contentacts_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</ListView>
</LinearLayout>
//.java实现
//声明
ArrayAdapter<String> adapter;
List<String> contactsList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//配置适配器
ListView contactsView = findViewById(R.id.contentacts_view);
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,contactsList);
contactsView.setAdapter(adapter);
//判断是否授权
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},1);
}else {
readContacts();
}
}
//获取系统联系人信息
private void readContacts(){
Cursor cursor = null;
try {
//查询联系人数据
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
if (cursor != null){
//moveToNext():光标移动到下一行
while (cursor.moveToNext()){
//获取联系人姓名
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//获取联系人手机号
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
//因为我使用的是simple_list_item_1(单行显示),所以需要把结果拼接
contactsList.add(displayName+"\n"+number);
}
//通知刷新ListView
adapter.notifyDataSetChanged();
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (cursor != null){
//关闭Cursor对象
cursor.close();
}
}
}
<!--AndroidManifest.xml文件-->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.xxx">
//添加权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application...>
</manifest>