首先编辑一下布局文件。
联系人信息肯定是一条一条的,所以在布局中使用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" android:orientation="vertical"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent"></ListView> </LinearLayout>
之后修改MainActivity中的代码
1 import android.Manifest; 2 import android.content.pm.PackageManager; 3 import android.database.Cursor; 4 import android.os.Bundle; 5 import android.provider.ContactsContract; 6 import android.support.annotation.NonNull; 7 import android.support.v4.app.ActivityCompat; 8 import android.support.v4.content.ContextCompat; 9 import android.support.v7.app.AppCompatActivity; 10 import android.widget.ArrayAdapter; 11 import android.widget.ListView; 12 import android.widget.Toast; 13 14 import java.util.ArrayList; 15 import java.util.List; 16 17 public class MainActivity extends AppCompatActivity { 18 19 List<String> contactsList = new ArrayList<>(); 20 ArrayAdapter<String> adapter = null; 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.activity_main); 26 /* 27 * 首先获取ListView实例然后 给其设置好适配器 28 */ 29 ListView lv = (ListView)findViewById(R.id.lv); 30 adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,contactsList); 31 lv.setAdapter(adapter); 32 //6.0以上的系统中需要添加运行时权限 33 if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){ 34 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},1); 35 }else{ 36 readContacts(); 37 } 38 } 39 40 private void readContacts(){ 41 Cursor cursor = null; 42 try{ 43 //查询联系人数据 44 //这里没有通过Uri.parse()方法进行解析,是因为ContactsContract.CommonDataKinds.Phone.CONTENT_URI已经做好了封装,提供了一个CONTENT_URL常量,而这个常量就是Uri.parse解析出来的结果 45 cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null); 46 if(cursor != null){ 47 //对cursor进行遍历 获取联系人信息 48 while(cursor.moveToNext()){ 49 //ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME 对应的是联系人姓名 50 //ContactsContract.CommonDataKinds.Phone.NUMBER 对应的是联系人电话 51 String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 52 String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 53 //将联系人姓名电话添加到contactsList中 54 contactsList.add(displayName + " " + number); 55 } 56 } 57 //刷新一下ListView 58 adapter.notifyDataSetChanged(); 59 }catch (Exception e){ 60 e.printStackTrace(); 61 }finally { 62 //将cursor关闭 63 if(cursor != null){ 64 cursor.close(); 65 } 66 } 67 } 68 69 70 @Override 71 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 72 switch (requestCode){ 73 case 1: 74 if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 75 readContacts(); 76 }else{ 77 Toast.makeText(this,"Failed",Toast.LENGTH_SHORT).show(); 78 } 79 break; 80 default: break; 81 } 82 } 83 }
最后需要在AndroidManifest.xml内添加如下权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
读取联系人只需要获取到联系人程序的内容URI,然后借助ContentResolver进行增删改查操作即可。
需要注意的是Andoird6.0系统中增加了运行时权限这个功能