简化开发

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>
上一篇 下一篇

猜你喜欢

热点阅读