读取手机联系人

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CodingEnding/article/details/72904748

前言

读取手机联系人是Android应用中很常见的操作,也是很多应用的功能基础,本文就简单讲解一下如何使用ContentResolver对手机联系人进行读取。

主要代码

逻辑部分

public class MainActivity extends AppCompatActivity {
    private ListView contactsListView;//联系人列表
    private ArrayAdapter<String> contactsAdapter;//列表适配器
    private ArrayList<String> contactsList;//列表数据源

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        contactsListView= (ListView) findViewById(R.id.list_contacts);
        contactsList=new ArrayList<String>();
        contactsAdapter=new ArrayAdapter<String>(this,android.R.layout.
                simple_list_item_1,contactsList);
        contactsListView.setAdapter(contactsAdapter);//设置适配器

        findViewById(R.id.read_contacts).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //检查是否具备读取联系人的权限
                if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.
                        READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED){
                    //没有权限则申请权限
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.READ_CONTACTS},1);
                }else{
                    readContacts();//有权限则直接读取联系人
                }
            }
        });
    }

    //读取联系人
    private void readContacts(){
        contactsList.clear();//清空数据
        Cursor cursor=null;//用于读取数据的游标
        try {
            //使用Android预定义的Uri对象查询数据
            cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null,null,null,null);
            if(cursor.moveToFirst()){
                do{
                    String name=cursor.getString(cursor.getColumnIndex(
                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));//姓名
                    String phoneNumber=cursor.getString(cursor.getColumnIndex(
                            ContactsContract.CommonDataKinds.Phone.NUMBER));//电话号码
                    contactsList.add(name+" "+phoneNumber);
                }while(cursor.moveToNext());
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } finally {
            if(cursor!=null){//关闭资源
                cursor.close();
            }
        }
        contactsAdapter.notifyDataSetChanged();//刷新列表数据
    }

    @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_SHORT).show();
                }
                break;
            default:
                break;
        }
    }
}

界面布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.readcontacts.MainActivity">

    <Button
        android:id="@+id/read_contacts"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="读取联系人"/>

    <TextView
        android:id="@+id/tips"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/read_contacts"
        android:layout_alignParentLeft="true"
        android:layout_margin="8dp"
        android:text="联系人列表"/>

    <!-- 联系人列表 -->
    <ListView
        android:id="@+id/list_contacts"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/tips">
    </ListView>

</RelativeLayout>

权限

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.readcontacts">

    <!-- 声明读取联系人的权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        ......
    </application>

</manifest>

需要注意的是,在上述代码中用到了运行时权限相关的知识,这是Android6.0之后新增的机制,具体细节可以参考这篇博客:

详解Android权限机制

效果预览

将读取到的联系人信息加载到ListView中:

demo下载地址

Android读取手机联系人

猜你喜欢

转载自blog.csdn.net/CodingEnding/article/details/72904748