安卓開發5——利用ContentProvider獲取手機聯絡人
目錄
一、實驗內容
使用ContentProvider獲取手機聯絡人。
二、作業過程和結果
1、首先在模擬器中新增幾個聯絡人,作為本專案的獲取目標。
2、本專案包含兩個java檔案和兩個佈局檔案,如下圖。後面會分別介紹這些檔案。
3、建立主活動ReadContacts,並對應佈局activity_read_contacts.xml。佈局很簡單,就一個按鈕和一個ListView。主活動中通過點選事件對聯絡人進行獲取,其中最主要的是授權以及授權通過後的聯絡人獲取,關鍵程式碼如下。
activity_read_contacts.xml佈局檔案
點選按鈕,建立介面卡,並對許可權進行判斷
對使用者選擇的許可權進行接收處理
許可權通過後對聯絡人進行讀取
自定義介面卡
4、MyPeople是聯絡人類,它包含name和number欄位和對應屬性方法,分別對應聯絡人的姓名和電話。
5、people_info_xml是ListView中每個子項的佈局,它包含兩個TextView,分別顯示聯絡人姓名和電話號碼。在例項化介面卡的時候傳入該佈局。
6、最後在AndroidManifest檔案中宣告許可權,如下。
<uses-permission android:name="android.permission.READ_CONTACTS"/>
7、到此所有步驟完成,執行程式,點選獲取聯絡人按鈕,結果如下。
三、完整程式碼
ReadContacts.java
package com.example.lab.getcontacts;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Color;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import android.Manifest;
public class ReadContacts extends AppCompatActivity {
//建立一個peopleList用於儲存聯絡人
public List<MyPeople> peopleList=new ArrayList<>();
//建立一個介面卡,後面將用它把聯絡人的資訊傳遞給ListView
PeopleAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read_contacts);
Button getContacts=(Button)findViewById(R.id.btn_getContacts);
getContacts.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
adapter=new PeopleAdapter(ReadContacts.this,R.layout.people_info,peopleList);
ListView myListView=(ListView)findViewById(R.id.myListView);
myListView.setAdapter(adapter);
//判斷是否獲得許可權
if(ContextCompat.checkSelfPermission(ReadContacts.this, Manifest.permission.READ_CONTACTS)!=PackageManager.PERMISSION_GRANTED){
//開啟授權對話方塊
ActivityCompat.requestPermissions(ReadContacts.this,new String[]{Manifest.permission.READ_CONTACTS},1);
}else{
readContacts();
}
}
});
}
//接收使用者授權選擇
@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_LONG).show();
}
break;
default:
}
}
//讀取聯絡人的方法
private void readContacts()
{
Cursor cursor=null;
try{
//查詢聯絡人資料
cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
//獲得聯絡人個數
int count=cursor.getCount();
//建立MyPeople陣列,用於裝載每一位聯絡人
MyPeople[] myPeoples=new MyPeople[count];
int i=0;
if(cursor!=null)
{
while(cursor.moveToNext()){
String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
//例項化聯絡人物件
myPeoples[i]=new MyPeople();
myPeoples[i].setName(name);
myPeoples[i].setNumber(number);
//將每一個聯絡人放進peopleList
peopleList.add(myPeoples[i]);
i++;
}
adapter.notifyDataSetChanged();
}
}catch(Exception e)
{
e.printStackTrace();
}finally{
if(cursor!=null)
{
cursor.close();
}
}
}
//自定義一個介面卡
public class PeopleAdapter extends ArrayAdapter<MyPeople>{
private int resourceID;
public PeopleAdapter(Context context, int resource, List<MyPeople> objects) {
super(context, resource, objects);
resourceID=resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyPeople myPeople=getItem(position);
View view= LayoutInflater.from(getContext()).inflate(resourceID,parent,false);
TextView tvName= (TextView)view.findViewById(R.id.textView_name);
tvName.setText("姓名:"+myPeople.getName());
tvName.setTextColor(Color.BLACK);
TextView tvNumber= (TextView)view.findViewById(R.id.textView_number);
tvNumber.setText("電話:"+myPeople.getNumber());
tvNumber.setTextColor(Color.BLACK);
return view;
}
}
}
MyPeople.java
package com.example.lab.getcontacts;
/**
* Created by Lab on 2018/12/15.
*/
public class MyPeople {
String name;
String number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}