Android使用Intent獲取聯(lián)系人信息
Intent的使用
趁著工作之余,看了一下intent,發(fā)現(xiàn)好多知識都已經(jīng)忘記了,然后自己有重新復習了一遍,在這里做一下筆記,以下為自己總結(jié)的幾點:
- intent是一個好東西
- 他可以啟動Activity還可以回調(diào)數(shù)據(jù)
- 調(diào)用各種數(shù)據(jù),聯(lián)系人等等
- 進程之間可以接收同一個intent
- 三大組件的橋梁
解釋一下為什么是三大組件吧,都知道四大組件分別是Activity,Service,BroadCastReceiver,ContentProvider。Intent是Activity,Service,BroadCastReceiver這三大組件之間的橋梁,而ContentProvider是通過ContentResolver來通信的,所以說是三大組件的橋梁。
Intent使用的時候需要定義一個action和data,action就是他要執(zhí)行的動作,data就是他所執(zhí)行動作的數(shù)據(jù)。
比如說我們要撥打電話
Uri number = Uri.parse("tel:10086"); Intent callIntent = new Intent(Intent.ACTION_CALL, number); startActivity(callIntent);
當然不要忘記加權(quán)限
<uses-permission android:name="android.permission.CALL_PHONE"/>
查看網(wǎng)頁
Uri webpage = Uri.parse("http://www.baidu.com"); Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
發(fā)送一個帶附件的email
查看地圖等等都可以實現(xiàn),但是不要忘記加上權(quán)限。
忘記說了,盡管Android系統(tǒng)會確保每一個確定的intent會被系統(tǒng)內(nèi)置的app接收,但是我們還是應(yīng)該在觸發(fā)一個intent之前做驗證是否有App接受這個intent的步驟。(如果觸發(fā)了一個intent,而且沒有任何一個app會去接收這個intent,則app會crash。)
為了驗證是否有合適的activity會響應(yīng)這個intent,需要執(zhí)行queryIntentActivities() 來獲取到能夠接收這個intent的所有activity的list。若返回的List非空,那么我們才可以安全的使用這個intent。例如:
PackageManager packageManager = getPackageManager(); List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
下面就說些比較實用的吧,在開發(fā)中我們經(jīng)常會遇到讀取手機聯(lián)系人信息的時候把,分成兩部分說一下讀取聯(lián)系人吧
讀取單個聯(lián)系人
注意了,因為聯(lián)系人內(nèi)容是敏感權(quán)限,6.0以上的要動態(tài)授權(quán),并自Manifest文件中添加讀取手機聯(lián)系人的權(quán)限。
<uses-permission android:name="android.permission.READ_CONTACTS"/>
讀取單個聯(lián)系人是通過startActivityForResult來獲取的,返回你需要的某個聯(lián)系人信息,當然,如果你需要全部聯(lián)系人信息,也請不要著急,下面也會有介紹。
public static final int PICK_CONTACT_REQUEST = 1; //這是拉起手機聯(lián)系人列表 private void pickContact() { Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts")); pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); }
通過startActivityForResult拉起聯(lián)系人列表之后,我們需要重新onActivityResult方法,第二個activity指定的result code。如果操作成功則是RESULT_OK ,如果用戶沒有操作成功,而是直接點擊回退或者其他什么原因,那么則是RESULT_CANCELED,這也是result code默認是RESULT_CANCELED的原因,里面就會有我們需要的數(shù)據(jù)。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { if (resultCode == RESULT_OK) { Uri contactUri = data.getData(); //如果需要別的信息,就在這里添加參數(shù) String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver() .query(contactUri, projection, null, null, null); //將游標移動到第一行 cursor.moveToFirst(); //返回列名對應(yīng)的列的索引值 int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); //返回當前行指定列的值,這里就是電話 String number = cursor.getString(column); Log.e("onActivityResult: ", number); } } }
讀取所有聯(lián)系人
private static final int PHONES_NUMBER_INDEX = 1; private static final int PHONES_DISPLAY_NAME_INDEX = 0; private static final int PHONES_CONTACT_ID_INDEX = 3; private static final int PHONES_PHOTO_ID_INDEX = 2; private void getPhoneContacts() { ContentResolver resolver = getContentResolver(); String[] projection = {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Photo.PHOTO_ID, ContactsContract.CommonDataKinds.Phone.CONTACT_ID, // "_id" };//COLLATE LOCALIZED Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; // 獲取手機聯(lián)系人 Cursor phoneCursor = resolver.query(uri, projection, null, null, null); if (phoneCursor != null) { while (phoneCursor.moveToNext()) { //得到手機號碼 String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX); //當手機號碼為空的或者為空字段 跳過當前循環(huán) if (TextUtils.isEmpty(phoneNumber)) continue; //得到聯(lián)系人名稱 String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX); //得到聯(lián)系人ID Long contactid = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX); //得到聯(lián)系人頭像ID Long photoid = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX); //得到聯(lián)系人頭像Bitamp Bitmap contactPhoto = null; //photoid 大于0 表示聯(lián)系人有頭像 如果沒有給此人設(shè)置頭像則給他一個默認的 if (photoid > 0) { Uri uri2 = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactid); InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(resolver, uri2); contactPhoto = BitmapFactory.decodeStream(input); } else { contactPhoto = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); } /** * 創(chuàng)建model類用于保存聯(lián)系人信息 */ Log.e("getPhoneContacts: ", "--- " +phoneNumber +" --- "+ "--- "+contactName +" --- "+ contactid); } phoneCursor.close(); } }
以上就是獲取全部聯(lián)系人數(shù)據(jù),如果需要單個聯(lián)系人的詳細數(shù)據(jù)的話,就按照獲取所有聯(lián)系人的參數(shù)自行修改就可以了。
相關(guān)文章
Android?NDK開發(fā)(C語言--聯(lián)合體與枚舉)
這篇文章主要介紹了Android?NDK開發(fā)C語言聯(lián)合體與枚舉,共用體是一種特殊的數(shù)據(jù)類型,允許您在相同的內(nèi)存位置存儲不同的數(shù)據(jù)類型。您可以定義一個帶有多成員的共用體,但是任何時候只能有一個成員帶有值。下面詳細介紹該內(nèi)容,需要的朋友可以參考一下2021-12-12Compose自定義View實現(xiàn)繪制Rainbow運動三環(huán)效果
這篇文章主要為大家介紹了一個基于Compose自定義的一個Rainbow彩虹運動三環(huán),業(yè)務(wù)上類似于iWatch上的那個運動三環(huán),感興趣的小伙伴可以了解一下2023-02-02Android應(yīng)用自動更新功能實現(xiàn)的方法
這篇文章主要為大家詳細介紹了Android應(yīng)用自動更新功能實現(xiàn)的方法,感興趣的小伙伴們可以參考一下2016-06-06Android 中 onSaveInstanceState()使用方法詳解
這篇文章主要介紹了Android 中 onSaveInstanceState()使用方法詳解的相關(guān)資料,希望通過本文大家能夠掌握這部分知識,需要的朋友可以參考下2017-09-09Android利用ContentProvider獲取本地數(shù)據(jù)的方法
這篇文章主要介紹了Android利用ContentProvider獲取本地數(shù)據(jù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04android 中 webview 怎么用 localStorage
這篇文章主要介紹了android 中 webview 怎么用 localStorage方法的相關(guān)資料,需要的朋友可以參考下2015-07-07Android Studio gradle 編譯提示‘default not found’ 解決辦法
這篇文章主要介紹了Android Studio gradle 編譯提示‘default not found’ 解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12android采用FFmpeg實現(xiàn)音視頻合成與分離
這篇文章主要為大家詳細介紹了android采用FFmpeg實現(xiàn)音視頻合成與分離,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12