日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android+6.0+通讯录,Android6.0的通讯录获取

發布時間:2023/12/20 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android+6.0+通讯录,Android6.0的通讯录获取 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Android Studio上實現基于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="獲取聯系人信息"

android:id="@+id/btnGetContacts"

android:layout_below="@+id/textView"

android:layout_alignParentStart="true"/>

3、為了后續開發的方便和規整,新建一個包Contacts用于存放獲取通訊錄所需的類。并在包中新建一個Activity:GetContacts。

由于Android6.0對APP運行權限做了較大改變,獲取通訊錄信息不僅需要靜態授權還需要動態申請權限,詳情見

Android6.0系統權限那些事

http://www.open-open.com/lib/view/open1450578678148.html

Android 6.0 運行時權限處理完全解析

http://www.w2bc.com/article/101798?from=extend

所以在這里需要給APP添加動態申請權限代碼,暫時先將其實現,下一篇博客再考慮封裝。新建一個String類型的方法getContacts(Context context),第一步檢查是否授權,如果沒有授權就申請權限

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,主要用于檢測某個權限是否已經被授予,方法返回值為PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。當返回DENIED就需要進行申請授權了。

ActivityCompat.requestPermissions,該方法是異步的,第一個參數是Context;第二個參數是需要申請的權限的字符串數組;第三個參數為requestCode,主要用于回調的時候檢測。可以從方法名requestPermissions以及第二個參數看出,是支持一次性申請多個權限的,系統會通過對話框逐一詢問用戶是否授權。

注:這里暫時沒有考慮權限申請回調onRequestPermissionsResult()方法,只是為了跑通該程序,在下一篇博客再具體分析關于權限的事兒。

4、授權成功后,開始執行獲取通訊錄功能:

在寫具體代碼前,先新建一個類:ContactsInfo用于通訊錄的數據封裝。定義需要獲取到的通訊錄信息字符串,并寫好構造函數。

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用于保存數據: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關閉,不然會造成內存泄露等問題

}catch (Exception e){

e.printStackTrace();

}finally {

context = null;

}

這里使用了sort_key對獲取到的通訊錄信息進行了排序,實現一個方法:

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、實現了基本功能后,我們需要將獲取到的數據展示在界面上。

在GetContacts的layout中添加一張ListView

android:layout_height="wrap_content"

android:id="@+id/ContactsLv"

android:layout_weight="1"/>

之后需要自定義一個adapter用于對ListView的數據傳遞。新建一個類:ContactsAdapter 擴展自BaseAdapter,新建一個contacts布局來展示該adapter的界面,并重構其四個方法:

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進行優化

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清除緩存,不然每一次運行都會重復加載數據:

@Override

public void onBackPressed() { //清除緩存

list.clear();

super.onBackPressed();

}

7、OK,大功告成~~在MainActvity中增加對Button的監聽即可。

總結

以上是生活随笔為你收集整理的android+6.0+通讯录,Android6.0的通讯录获取的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。