版权声明:本文为博主原创文章,未经博主允许不得转载。 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
之后新增的机制,具体细节可以参考这篇博客:
效果预览
将读取到的联系人信息加载到ListView
中: