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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android开发读取通讯录信息

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

需求
通過搜索聯系人的姓名獲取相應的詳細人信息,也可通過右側字母條搜索相應的聯系人信息。
主要代碼如下:
MainActivity

public class MainActivity extends AppCompatActivity {private ListView sortListView;private SideLetterUtil sideLetterUtil;private TextView dialog;private SortAdapter adapter;private ClearEditText mClearEditText;private String mobile,//被授權人電話號碼name;//被授權人姓名/*** 查詢通訊錄名字*/private Uri contactsUrl = ContactsContract.Contacts.CONTENT_URI;private ContentResolver resolver;private List<ContactsBean> nameList;/*** 漢字轉換成拼音的類*/private CharacterParser characterParser;private List<ContactsBean> SourceDateList;/*** 根據拼音來排列ListView里面的數據類*/private ContactsPinyinComparator pinyinComparator;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);getPersimmionInfo();}private void getPersimmionInfo() {if (Build.VERSION.SDK_INT >= 23) {//1. 檢測是否添加權限 PERMISSION_GRANTED 表示已經授權并可以使用if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {//手機為Android6.0的版本,權限未授權去i請授權//2. 申請請求授權權限//1. Activity// 2. 申請的權限名稱// 3. 申請權限的 請求碼ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS//通話錄}, 1005);} else {//手機為Android6.0的版本,權限已授權可以使用// 執行下一步initContacts();}} else {//手機為Android6.0以前的版本,可以使用initContacts();}}// 重寫方法 當權限申請后 執行 接收結果的作用@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);// 先判斷請求碼 與 請求時的 是否一致if (requestCode == 1005) {// 判斷請求結果長度 且 結果 為 允許訪問 則 進行使用;第一次授權成功后if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 可以使用initContacts();} else {//未授權不可以使用// 攝像機或讀寫內存卡權限授權將不能使用以下功能。Toast.makeText(MainActivity.this, "未授權不可以使用", Toast.LENGTH_SHORT).show();}}}private void initContacts() {//實例化漢字轉拼音類characterParser = CharacterParser.getInstance();pinyinComparator = new ContactsPinyinComparator();//右側26個字母和#sideLetterUtil = (SideLetterUtil) findViewById(R.id.sidrbar);//中間顯示字母dialog = (TextView) findViewById(R.id.dialog);sideLetterUtil.setTextView(dialog);//設置右側觸摸監聽sideLetterUtil.setOnTouchingLetterChangedListener(new SideLetterUtil.OnTouchingLetterChangedListener() {@Overridepublic void onTouchingLetterChanged(String s) {//該字母首次出現的位置int position = adapter.getPositionForSection(s.charAt(0));if (position != -1) {sortListView.setSelection(position);}}});sortListView = (ListView) findViewById(R.id.lv_contacts_item);/*** 查詢通訊錄名字*/nameList = new ArrayList<>();resolver = getContentResolver();//用于查詢電話號碼的URIUri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;// 查詢的字段String[] projection = {ContactsContract.CommonDataKinds.Phone._ID,//IdContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,//通訊錄姓名ContactsContract.CommonDataKinds.Phone.DATA1, "sort_key",//通訊錄手機號ContactsContract.CommonDataKinds.Phone.CONTACT_ID,//通訊錄IdContactsContract.CommonDataKinds.Phone.PHOTO_ID,//手機號IdContactsContract.CommonDataKinds.Phone.LOOKUP_KEY};Cursor cursor = resolver.query(phoneUri, projection, null, null, null);while ((cursor.moveToNext())) {String name = cursor.getString(1);String phone = cursor.getString(2);nameList.add(new ContactsBean(name, phone));}SourceDateList = filledData(nameList);// 根據a-z進行排序源數據Collections.sort(SourceDateList, pinyinComparator);adapter = new SortAdapter(this, SourceDateList);sortListView.setAdapter(adapter);adapter.setOnCliker(new SortAdapter.OnClicker() {@Overridepublic void onClik(String name1, String phone1) {//這里要利用adapter.getItem(position)來獲取當前position所對應的對象mobile = phone1;if (MobileUtil.isMobileNO(mobile)) {//無通訊姓名則為StrConfig.CONTACTS_NAME_NULLname = (TextUtils.equals(name1, "未備注聯系人"))? "null" : name1;Toast.makeText(MainActivity.this,name + mobile, Toast.LENGTH_SHORT).show();} else {//該用戶無手機號,或手機號格式不正確Toast.makeText(MainActivity.this,"該用戶無手機號,或手機號格式不正確", Toast.LENGTH_SHORT).show();}}});mClearEditText = findViewById(R.id.filter_edit);//根據輸入框輸入值的改變來過濾搜索mClearEditText.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {//當輸入框里面的值為空,更新為原來的列表,否則為過濾數據列表filterData(s.toString());}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {}@Overridepublic void afterTextChanged(Editable s) {}});}/*** 為ListView填充數據*/private List<ContactsBean> filledData(List<ContactsBean> date) {List<ContactsBean> mSortList = new ArrayList<ContactsBean>();for (int i = 0; i < date.size(); i++) {ContactsBean contactsBean = new ContactsBean();contactsBean.setName(date.get(i).getName());contactsBean.setPhone(date.get(i).getPhone());//漢字轉換成拼音String pinyin = characterParser.getSelling(date.get(i).getName());String sortString = pinyin.substring(0, 1).toUpperCase();// 正則表達式,判斷首字母是否是英文字母if (sortString.matches("[A-Z]")) {contactsBean.setSortLetters(sortString.toUpperCase());} else {contactsBean.setSortLetters("#");}mSortList.add(contactsBean);}return mSortList;}/*** 根據輸入框中的值來過濾數據并更新ListView** @param filterStr*/private void filterData(String filterStr) {List<ContactsBean> filterDateList = new ArrayList<ContactsBean>();if (TextUtils.isEmpty(filterStr)) {filterDateList = SourceDateList;} else {filterDateList.clear();for (ContactsBean contactsBean : SourceDateList) {String name = contactsBean.getName();if (name.indexOf(filterStr.toString()) != -1 || characterParser.getSelling(name).startsWith(filterStr.toString())) {filterDateList.add(contactsBean);}}}// 根據a-z進行排序Collections.sort(filterDateList, pinyinComparator);adapter.updateListView(filterDateList);} }

SortAdapter

public class SortAdapter extends BaseAdapter implements SectionIndexer {private List<ContactsBean> list = null;private Context mContext;private OnClicker onClicker;public SortAdapter(Context mContext, List<ContactsBean> list) {this.mContext = mContext;this.list = list;}/*** 當ListView數據發生變化時,調用此方法來更新ListView** @param list*/public void updateListView(List<ContactsBean> list) {this.list = list;notifyDataSetChanged();}public int getCount() {return this.list.size();}public Object getItem(int position) {return list.get(position);}public long getItemId(int position) {return position;}public View getView(final int position, View view, ViewGroup arg2) {ViewHolder viewHolder = null;final ContactsBean mContent = list.get(position);if (view == null) {viewHolder = new ViewHolder();view = LayoutInflater.from(mContext).inflate(R.layout.contacts_item, null);viewHolder.rlContacts = view.findViewById(R.id.rl_contacts);viewHolder.tvTitle = view.findViewById(R.id.tv_contacts_item_title);viewHolder.tvLetter = view.findViewById(R.id.tv_contacts_item_catalog);view.setTag(viewHolder);} else {viewHolder = (ViewHolder) view.getTag();}//根據position獲取分類的首字母的Char ascii值int section = getSectionForPosition(position);//如果當前位置等于該分類首字母的Char的位置 ,則認為是第一次出現if (position == getPositionForSection(section)) {viewHolder.tvLetter.setVisibility(View.VISIBLE);viewHolder.tvLetter.setText(mContent.getSortLetters());} else {viewHolder.tvLetter.setVisibility(View.GONE);}final String mobile = this.list.get(position).getPhone().replaceAll(" ", "").replaceAll("\\+", "").replaceAll("-", "");viewHolder.tvTitle.setText(this.list.get(position).getName());viewHolder.rlContacts.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {onClicker.onClik(list.get(position).getName(), mobile);}});return view;}final static class ViewHolder {private TextView tvLetter,//首字母tvTitle;//名字private RelativeLayout rlContacts;//tvIsImpower;//是否授權}/*** 根據ListView的當前位置獲取分類的首字母的Char ascii值*/public int getSectionForPosition(int position) {return list.get(position).getSortLetters().charAt(0);}/*** 根據分類的首字母的Char ascii值獲取其第一次出現該首字母的位置*/public int getPositionForSection(int section) {for (int i = 0; i < getCount(); i++) {String sortStr = list.get(i).getSortLetters();char firstChar = sortStr.toUpperCase().charAt(0);if (firstChar == section) {return i;}}return -1;}public void setOnCliker(OnClicker onClicker) {this.onClicker = onClicker;}/*** 提取英文的首字母,非英文字母用#代替。** @param str* @return*/private String getAlpha(String str) {String sortStr = str.trim().substring(0, 1).toUpperCase();// 正則表達式,判斷首字母是否是英文字母if (sortStr.matches("[A-Z]")) {return sortStr;} else {return "#";}}@Overridepublic Object[] getSections() {return null;}public interface OnClicker {void onClik(String name, String phone);} }

SideLetterUtil

public class SideLetterUtil extends View {// 觸摸事件private OnTouchingLetterChangedListener onTouchingLetterChangedListener;public static String[] b = {"常用", "A", "B", "C", "D", "E", "F", "G", "H", "I","J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V","W", "X", "Y", "Z", "#"};private int choose = -1;// 選中private Paint paint = new Paint();private TextView mTextDialog;private Context context;public void setTextView(TextView mTextDialog) {this.mTextDialog = mTextDialog;// this.mTextDialog.setTextColor(getResources().getColor(R.color.primary_green));}public SideLetterUtil(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);this.context = context;}public SideLetterUtil(Context context, AttributeSet attrs) {super(context, attrs);this.context = context;}public SideLetterUtil(Context context) {super(context);this.context = context;}/*** 重寫這個方法*/protected void onDraw(Canvas canvas) {super.onDraw(canvas);// 獲取焦點改變背景顏色.int height = getHeight();// 獲取對應高度int width = getWidth(); // 獲取對應寬度int singleHeight = height / b.length;// 獲取每一個字母的高度for (int i = 0; i < b.length; i++) {paint.setColor(Color.rgb(33, 65, 98));paint.setColor(getResources().getColor(R.color.primary_green));paint.setTypeface(Typeface.DEFAULT_BOLD);paint.setAntiAlias(true);paint.setTextSize(DensityUtil.dp2px(context, 8));// 選中的狀態if (i == choose) {paint.setColor(Color.parseColor("#3399ff"));paint.setFakeBoldText(true);}// x坐標等于中間-字符串寬度的一半.float xPos = width / 2 - paint.measureText(b[i]) / 2;float yPos = singleHeight * i + singleHeight;canvas.drawText(b[i], xPos, yPos, paint);paint.reset();// 重置畫筆}}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {final int action = event.getAction();final float y = event.getY();// 點擊y坐標final int oldChoose = choose;final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;final int c = (int) (y / getHeight() * b.length);// 點擊y坐標所占總高度的比例*b數組的長度就等于點擊b中的個數.switch (action) {case MotionEvent.ACTION_UP:setBackgroundDrawable(new ColorDrawable(0x00000000));choose = -1;//invalidate();if (mTextDialog != null) {mTextDialog.setVisibility(View.INVISIBLE);}break;default:setBackgroundResource(R.drawable.sidebar_background);if (oldChoose != c) {if (c >= 0 && c < b.length) {if (listener != null) {listener.onTouchingLetterChanged(b[c]);}if (mTextDialog != null) {mTextDialog.setText(b[c]);mTextDialog.setVisibility(View.VISIBLE);}choose = c;invalidate();}}break;}return true;}/*** 向外公開的方法** @param onTouchingLetterChangedListener*/public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) {this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;}/*** 接口*/public interface OnTouchingLetterChangedListener {public void onTouchingLetterChanged(String s);}}

效果圖

  • 源碼: Android開發讀取通訊錄信息

總結

以上是生活随笔為你收集整理的Android开发读取通讯录信息的全部內容,希望文章能夠幫你解決所遇到的問題。

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