读取手机联系人

xiaoxiao2021-02-28  96

前言

读取手机联系人是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读取手机联系人

转载请注明原文地址: https://www.6miu.com/read-66115.html

最新回复(0)