您的位置:首页 > 移动开发 > Android开发

读取手机内联系人信息

2017-08-20 09:32 417 查看

这里我们将读取出来的联系人信息显示在ListView中。

第一步,编写布局文件:

<?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">

<ListView
android:id="@+id/contacts_view"
android:layout_width="match_parent"
android:layout_height="match_parent">

</ListView>

</LinearLayout>


接下来是MainActivity中的代码:

public class MainActivity extends AppCompatActivity {
ArrayAdapter<String> adapter;

List<String> contactsList = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView contactsView = (ListView) findViewById(R.id.contacts_view);
adapter = new ArrayAdapter<>(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){
while (cursor.moveToNext()){
//获取联系人的姓名
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//获取联系人的电话号码
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactsList.add(displayName + "\n" + number);
}
adapter.notifyDataSetChanged();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(cursor != null){
cursor.close();
}
}
}

@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, "You denied the permission", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
}


首先获取了ListView控件的实例,并给它设置好了适配器,然后开始条用运行时权限的处理逻辑,因为READ_CONTACTS权限属于危险权限(在前面的一篇博客中我有详细的说明)。最后调用readContacts()方法来读取联系人信息,这里使用了ContentResolver的qury()方法来查询联系人数据,这个方法和SQLiteDatabase的差不多,就是第一个参数有不同,前者是接受一个Uri参数,后者则是接收表名参数。然后将取出的数据添加到ListView的数据源中,并通知刷新一下ListView。最后要记得将Cursor对象关掉。


最后一步,在AndroidManifeat.xml中添加读取系统联系人的权限:

<uses-permission android:name="android.permission.READ_CONTACTS"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android listview