Android使用Intent獲取聯(lián)系人信息
Intent的使用
趁著工作之余,看了一下intent,發(fā)現(xiàn)好多知識(shí)都已經(jīng)忘記了,然后自己有重新復(fù)習(xí)了一遍,在這里做一下筆記,以下為自己總結(jié)的幾點(diǎn):
- intent是一個(gè)好東西
- 他可以啟動(dòng)Activity還可以回調(diào)數(shù)據(jù)
- 調(diào)用各種數(shù)據(jù),聯(lián)系人等等
- 進(jìn)程之間可以接收同一個(gè)intent
- 三大組件的橋梁
解釋一下為什么是三大組件吧,都知道四大組件分別是Activity,Service,BroadCastReceiver,ContentProvider。Intent是Activity,Service,BroadCastReceiver這三大組件之間的橋梁,而ContentProvider是通過(guò)ContentResolver來(lái)通信的,所以說(shuō)是三大組件的橋梁。
Intent使用的時(shí)候需要定義一個(gè)action和data,action就是他要執(zhí)行的動(dòng)作,data就是他所執(zhí)行動(dòng)作的數(shù)據(jù)。
比如說(shuō)我們要撥打電話
Uri number = Uri.parse("tel:10086");
Intent callIntent = new Intent(Intent.ACTION_CALL, number);
startActivity(callIntent);
當(dāng)然不要忘記加權(quán)限
<uses-permission android:name="android.permission.CALL_PHONE"/>
查看網(wǎng)頁(yè)
Uri webpage = Uri.parse("http://www.baidu.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
發(fā)送一個(gè)帶附件的email
查看地圖等等都可以實(shí)現(xiàn),但是不要忘記加上權(quán)限。
忘記說(shuō)了,盡管Android系統(tǒng)會(huì)確保每一個(gè)確定的intent會(huì)被系統(tǒng)內(nèi)置的app接收,但是我們還是應(yīng)該在觸發(fā)一個(gè)intent之前做驗(yàn)證是否有App接受這個(gè)intent的步驟。(如果觸發(fā)了一個(gè)intent,而且沒(méi)有任何一個(gè)app會(huì)去接收這個(gè)intent,則app會(huì)crash。)
為了驗(yàn)證是否有合適的activity會(huì)響應(yīng)這個(gè)intent,需要執(zhí)行queryIntentActivities() 來(lái)獲取到能夠接收這個(gè)intent的所有activity的list。若返回的List非空,那么我們才可以安全的使用這個(gè)intent。例如:
PackageManager packageManager = getPackageManager(); List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
下面就說(shuō)些比較實(shí)用的吧,在開發(fā)中我們經(jīng)常會(huì)遇到讀取手機(jī)聯(lián)系人信息的時(shí)候把,分成兩部分說(shuō)一下讀取聯(lián)系人吧
讀取單個(gè)聯(lián)系人
注意了,因?yàn)槁?lián)系人內(nèi)容是敏感權(quán)限,6.0以上的要?jiǎng)討B(tài)授權(quán),并自Manifest文件中添加讀取手機(jī)聯(lián)系人的權(quán)限。
<uses-permission android:name="android.permission.READ_CONTACTS"/>
讀取單個(gè)聯(lián)系人是通過(guò)startActivityForResult來(lái)獲取的,返回你需要的某個(gè)聯(lián)系人信息,當(dāng)然,如果你需要全部聯(lián)系人信息,也請(qǐng)不要著急,下面也會(huì)有介紹。
public static final int PICK_CONTACT_REQUEST = 1;
//這是拉起手機(jī)聯(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);
}
通過(guò)startActivityForResult拉起聯(lián)系人列表之后,我們需要重新onActivityResult方法,第二個(gè)activity指定的result code。如果操作成功則是RESULT_OK ,如果用戶沒(méi)有操作成功,而是直接點(diǎn)擊回退或者其他什么原因,那么則是RESULT_CANCELED,這也是result code默認(rèn)是RESULT_CANCELED的原因,里面就會(huì)有我們需要的數(shù)據(jù)。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if (resultCode == RESULT_OK) {
Uri contactUri = data.getData();
//如果需要?jiǎng)e的信息,就在這里添加參數(shù)
String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER};
Cursor cursor = getContentResolver()
.query(contactUri, projection, null, null, null);
//將游標(biāo)移動(dòng)到第一行
cursor.moveToFirst();
//返回列名對(duì)應(yīng)的列的索引值
int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
//返回當(dāng)前行指定列的值,這里就是電話
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;
// 獲取手機(jī)聯(lián)系人
Cursor phoneCursor = resolver.query(uri, projection, null, null, null);
if (phoneCursor != null) {
while (phoneCursor.moveToNext()) {
//得到手機(jī)號(hào)碼
String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);
//當(dāng)手機(jī)號(hào)碼為空的或者為空字段 跳過(guò)當(dāng)前循環(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)系人有頭像 如果沒(méi)有給此人設(shè)置頭像則給他一個(gè)默認(rèn)的
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ù),如果需要單個(gè)聯(lián)系人的詳細(xì)數(shù)據(jù)的話,就按照獲取所有聯(lián)系人的參數(shù)自行修改就可以了。
相關(guān)文章
Android RecyclerView上拉加載和下拉刷新(基礎(chǔ)版)
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView上拉加載和下拉刷新的相實(shí)現(xiàn)方法,內(nèi)容簡(jiǎn)單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Kotlin基礎(chǔ)學(xué)習(xí)之位運(yùn)算
一提起位運(yùn)算,人們往往想到它的高效性,無(wú)論是嵌入式編程還是優(yōu)化系統(tǒng)的核心代碼,適當(dāng)?shù)倪\(yùn)用位運(yùn)算總是一種迷人的手段,下面這篇文章主要給大家介紹了關(guān)于Kotlin基礎(chǔ)學(xué)習(xí)之位運(yùn)算的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-11-11
Android?Jetpack組件ViewModel基本用法詳解
這篇文章主要為大家介紹了Android?Jetpack組件ViewModel基本用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android OkHttp的簡(jiǎn)單使用和封裝詳解
這篇文章主要介紹了Android OkHttp的簡(jiǎn)單使用和封裝詳解的相關(guān)資料,Android OKHttp的簡(jiǎn)單get、post的使用,再到它的封裝,需要的朋友可以參考下2016-12-12
android TextView屬性的詳細(xì)介紹 分享
android TextView屬性的詳細(xì)介紹 分享,需要的朋友可以參考一下2013-05-05
android 獲取本機(jī)的IP地址和mac物理地址的實(shí)現(xiàn)方法
本文主要介紹android 獲取本機(jī)的IP地址和mac物理地址的實(shí)現(xiàn)方法,這里提供示例代碼,實(shí)現(xiàn)功能,有需要的小伙伴可以參考下2016-09-09
25個(gè)實(shí)用酷炫的Android開源UI框架
本文為大家分享了25個(gè)實(shí)用酷炫的Android開源UI框架,靈活運(yùn)用這些UI框架可在日常工作中節(jié)省不少時(shí)間2018-04-04

