android+6.0+通讯录,Android6.0的通讯录获取
在Android Studio上實現(xiàn)基于Android6.0的通訊錄獲取功能
1、新建一個Android項目,API選擇23: Android6.0(Marshmallow)
2、在MainActivity的layout中添加一個button用于獲取通信錄功能
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="獲取聯(lián)系人信息"
android:id="@+id/btnGetContacts"
android:layout_below="@+id/textView"
android:layout_alignParentStart="true"/>
3、為了后續(xù)開發(fā)的方便和規(guī)整,新建一個包Contacts用于存放獲取通訊錄所需的類。并在包中新建一個Activity:GetContacts。
由于Android6.0對APP運行權(quán)限做了較大改變,獲取通訊錄信息不僅需要靜態(tài)授權(quán)還需要動態(tài)申請權(quán)限,詳情見
Android6.0系統(tǒng)權(quán)限那些事
http://www.open-open.com/lib/view/open1450578678148.html
Android 6.0 運行時權(quán)限處理完全解析
http://www.w2bc.com/article/101798?from=extend
所以在這里需要給APP添加動態(tài)申請權(quán)限代碼,暫時先將其實現(xiàn),下一篇博客再考慮封裝。新建一個String類型的方法getContacts(Context context),第一步檢查是否授權(quán),如果沒有授權(quán)就申請權(quán)限
if (ContextCompat.checkSelfPermission(context,android.Manifest.permission.READ_CONTACTS)
!=PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context,
new String[]{android.Manifest.permission.READ_CONTACTS},
1);
}
這里涉及到的API:
ContextCompat.checkSelfPermission,主要用于檢測某個權(quán)限是否已經(jīng)被授予,方法返回值為PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。當返回DENIED就需要進行申請授權(quán)了。
ActivityCompat.requestPermissions,該方法是異步的,第一個參數(shù)是Context;第二個參數(shù)是需要申請的權(quán)限的字符串數(shù)組;第三個參數(shù)為requestCode,主要用于回調(diào)的時候檢測。可以從方法名requestPermissions以及第二個參數(shù)看出,是支持一次性申請多個權(quán)限的,系統(tǒng)會通過對話框逐一詢問用戶是否授權(quán)。
注:這里暫時沒有考慮權(quán)限申請回調(diào)onRequestPermissionsResult()方法,只是為了跑通該程序,在下一篇博客再具體分析關(guān)于權(quán)限的事兒。
4、授權(quán)成功后,開始執(zhí)行獲取通訊錄功能:
在寫具體代碼前,先新建一個類:ContactsInfo用于通訊錄的數(shù)據(jù)封裝。定義需要獲取到的通訊錄信息字符串,并寫好構(gòu)造函數(shù)。
public class ContactsInfo {
private String name;
private String number;
private String sortKey;
private int id;
public ContactsInfo(String name,String number,String sortKey,int id){
setName(name);
setNumber(number);
setSortKey(sortKey);
setId(id);
}
定義一個ContactsInfo類型的List用于保存數(shù)據(jù):public static List list = new ArrayList();
然后再開始寫具體功能:
else {
try {
Uri contactUri =ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
Cursor cursor = context.getContentResolver().query(contactUri,
new String[]{"display_name", "sort_key", "contact_id","data1"},
null, null, "sort_key");
String contactName;
String contactNumber;
String contactSortKey;
int contactId;
while (cursor.moveToNext()) {
contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
contactNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactId = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
contactSortKey =getSortkey(cursor.getString(1));
ContactsInfo contactsInfo = new ContactsInfo(contactName,contactNumber,contactSortKey,contactId);
if (contactName!=null)
list.add(contactsInfo);
}
cursor.close();//使用完后一定要將cursor關(guān)閉,不然會造成內(nèi)存泄露等問題
}catch (Exception e){
e.printStackTrace();
}finally {
context = null;
}
這里使用了sort_key對獲取到的通訊錄信息進行了排序,實現(xiàn)一個方法:
private static String getSortkey(String sortKeyString){
String key =sortKeyString.substring(0,1).toUpperCase();
if (key.matches("[A-Z]")){
return key;
}else
return "#"; //獲取sort key的首個字符,如果是英文字母就直接返回,否則返回#。
}
5、實現(xiàn)了基本功能后,我們需要將獲取到的數(shù)據(jù)展示在界面上。
在GetContacts的layout中添加一張ListView
android:layout_height="wrap_content"
android:id="@+id/ContactsLv"
android:layout_weight="1"/>
之后需要自定義一個adapter用于對ListView的數(shù)據(jù)傳遞。新建一個類:ContactsAdapter 擴展自BaseAdapter,新建一個contacts布局來展示該adapter的界面,并重構(gòu)其四個方法:
public class ContactsAdapter extends BaseAdapter{
private List list;
private Context context;
public ContactsAdapter(List list,Context context){
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null){
convertView =LayoutInflater.from(context).inflate(R.layout.contacts,null);
holder = new ViewHolder();
holder.nametv = (TextView) convertView.findViewById(R.id.contactName);
holder.numbertv = (TextView) convertView.findViewById(R.id.contactNumber);
holder.nametv.setText(list.get(position).getName());
holder.numbertv.setText(list.get(position).getNumber());
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
holder.nametv.setText(list.get(position).getName());
holder.numbertv.setText(list.get(position).getNumber());
}
return convertView;
}
private static class ViewHolder{
TextView nametv;
TextView numbertv;
}
}
/**
* ViewHolder就是一個持有者的類,他里面一般沒有方法,只有屬性,作用就是一個臨時的儲存器,
* getView方法中每次返回的View存起來,可以下次再用。
* 這樣做的好處就是不必每次都到布局文件中去拿到你的View,提高了效率。
*/
這里使用了ViewHolder來對listvier進行優(yōu)化
6、在GetContacts活動中將ListView與ContactsAdapter進行綁定:
private ListView ContactsLv;
private ContactsAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_get_contacts);
GetContacts.getContacts(this);
ContactsLv = (ListView) findViewById(R.id.ContactsLv);
adapter = new ContactsAdapter(list, this);
ContactsLv.setAdapter(adapter);
}
另外,需要對list清除緩存,不然每一次運行都會重復加載數(shù)據(jù):
@Override
public void onBackPressed() { //清除緩存
list.clear();
super.onBackPressed();
}
7、OK,大功告成~~在MainActvity中增加對Button的監(jiān)聽即可。
總結(jié)
以上是生活随笔為你收集整理的android+6.0+通讯录,Android6.0的通讯录获取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视频眼镜中微显示器技术:LCD、LCoS
- 下一篇: Android培训武汉,武汉安卓培训之A