100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > android_基础_intent获取手机通讯录联系人电话号等信息

android_基础_intent获取手机通讯录联系人电话号等信息

时间:2019-10-07 02:46:40

相关推荐

android_基础_intent获取手机通讯录联系人电话号等信息

转载自: /jack_bear_csdn/article/details/80406904

打开手机通讯录和从通讯录获取手机联系人相关信息

1、简单的获取联系人的电话号码或电子邮件地址或邮政地址

static final int REQUEST_SELECT_CONTACT = 1;public void selectContact() {//action为Intent.ACTION_PICKIntent intent = new Intent(Intent.ACTION_PICK);//从有电话号码的联系人中选取intent.setType(monDataKinds.Phone.CONTENT_TYPE);//从有电子邮件地址的联系人中选取// intent.setType(monDataKinds.Email.CONTENT_TYPE);//从有邮政地址的联系人中选取。// intent.setType(monDataKinds.StructuredPostal.CONTENT_TYPE);if (intent.resolveActivity(getPackageManager()) != null) {startActivityForResult(intent, REQUEST_SELECT_CONTACT);}}

解析结果:

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == REQUEST_SELECT_CONTACT&& resultCode == RESULT_OK) {// 目标联系人的UriUri contactUri = data.getData();String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};Cursor cursor = getContentResolver().query(contactUri, projection,null, null, null); // if (cursor != null && cursor.moveToFirst()) {int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);//电话号码String number = cursor.getString(numberIndex);} } }

多个地方通过intent打开手机联系人,即多个解析为:

if (resultCode == RESULT_OK) {switch (requestCode) {case SELECT_CONTACT_ONE://选择通讯录联系人返回if (data == null) {return;}try {if (data.getData() != null) {Cursor cursor = getContentResolver().query(data.getData(),new String[]{monDataKinds.Phone.NUMBER, monDataKinds.Phone.DISPLAY_NAME},null, null, null);while (cursor.moveToNext()) {//取出该条数据的联系人姓名String name = cursor.getString(1);//取出该条数据的联系人的手机号String number = cursor.getString(0).replace(" ", "");String trim = pile("[^0-9]").matcher(number).replaceAll("").trim();personalNameOneEt.setText(name);personalPhoneOneTv.setText(trim);}cursor.close();}} catch (Exception e) {e.printStackTrace();}break;case SELECT_CONTACT_TWO://选择通讯录联系人返回if (data == null) {return;}try {if (data.getData() != null) {Cursor cursor = getContentResolver().query(data.getData(),new String[]{monDataKinds.Phone.NUMBER, monDataKinds.Phone.DISPLAY_NAME},null, null, null);while (cursor.moveToNext()) {//取出该条数据的联系人姓名String name = cursor.getString(1);//取出该条数据的联系人的手机号String number = cursor.getString(0).replace(" ", "");String trim = pile("[^0-9]").matcher(number).replaceAll("").trim();personalNameTwoEt.setText(name);personalPhoneTwoTv.setText(trim);}cursor.close();}} catch (Exception e) {e.printStackTrace();}break;default:break;}}

2、获取联系人头像Uri、名称等信息

打开手机联系人界面

static final int REQUEST_SELECT_CONTACT = 1;public void selectContact() {Intent intent = new Intent(Intent.ACTION_PICK);//type为ContactsContract.Contacts.CONTENT_TYPE时在真机上可以正常使用, 但是模拟器上可能无效, 即获取不到此时要改为 intent.type = monDataKinds.Phone.CONTENT_TYPEintent.setType(ContactsContract.Contacts.CONTENT_TYPE);if (intent.resolveActivity(getPackageManager()) != null) {startActivityForResult(intent, REQUEST_SELECT_CONTACT);}}

根据目标联系人的Uri获取该联系人的ContactsContract.Data.LOOKUP_KEY用于查询所需数据,这里借助系统的LoaderManager进行查询,以下为完整查询代码:

public class SecondActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {private static final String TAG = SecondActivity.class.getSimpleName();//定义查询的字段值,这里主要看联系人名称DISPLAY_NAME和头像资源的Uri--PHOTO_URI,当然,你也可以只列出你想要的字段,不必列出DATA1-DATA15private static final String[] PROJECTION =new String[]{ContactsContract.Data._ID,ContactsContract.Data.MIMETYPE,ContactsContract.Data.DISPLAY_NAME,ContactsContract.Data.PHOTO_URI,ContactsContract.Data.DATA1,ContactsContract.Data.DATA2,ContactsContract.Data.DATA3,ContactsContract.Data.DATA4,ContactsContract.Data.DATA5,ContactsContract.Data.DATA6,ContactsContract.Data.DATA7,ContactsContract.Data.DATA8,ContactsContract.Data.DATA9,ContactsContract.Data.DATA10,ContactsContract.Data.DATA11,ContactsContract.Data.DATA12,ContactsContract.Data.DATA13,ContactsContract.Data.DATA14,ContactsContract.Data.DATA15};// 查询语句,这里根据联系人表中的LOOKUP_KEY来查询private static final String SELECTION = ContactsContract.Data.LOOKUP_KEY + " = ?";private String[] mSelectionArgs = {""};//查询的目标联系人的LOOKUP_KEYprivate String mLookupKey;//排序条件private static final String SORT_ORDER = ContactsContract.Data.MIMETYPE;// 此次查询操作的标识id,如果只有一个查询,没其他查询操作可以不用static final int DETAILS_QUERY_ID = 0;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);mLookupKey = getIntent().getStringExtra(ContactsContract.Contacts.LOOKUP_KEY);// 初始化系统的LoaderManagergetLoaderManager().initLoader(DETAILS_QUERY_ID, null, this);}@Overridepublic Loader<Cursor> onCreateLoader(int id, Bundle args) {switch (id) {case DETAILS_QUERY_ID:mSelectionArgs[0] = mLookupKey;// 开始查询CursorLoader mLoader =new CursorLoader(SecondActivity.this,ContactsContract.Data.CONTENT_URI,PROJECTION,SELECTION,mSelectionArgs,SORT_ORDER);return mLoader;default:return null;}}@Overridepublic void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {switch (loader.getId()) {case DETAILS_QUERY_ID:cursor.moveToFirst();int nameColumnIndex = cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME);String name = cursor.getString(nameColumnIndex);Log.d(TAG, "联系人名称" + "======" + name);int photoColumnIndex = cursor.getColumnIndex(ContactsContract.Data.PHOTO_URI);String photoUri = cursor.getString(photoColumnIndex);Log.d(TAG, "联系人头像Uri" + "======" + photoUri);break;}}@Overridepublic void onLoaderReset(Loader<Cursor> loader) {switch (loader.getId()) {case DETAILS_QUERY_ID:/** 当前的loader被销毁时会回调这个方法,需要在这里释放掉对当前cursor的引用**/break;}}}

3、获取所有联系人信息

public static List<ContactInfo> readContactInfo(Context context) {Uri contactUri = Uri.parse("content://com.android.contacts/raw_contacts");Uri datatUri = Uri.parse("content://com.android.contacts/data");ContentResolver resolver = context.getContentResolver();Cursor cursor = resolver.query(contactUri, new String[]{"contact_id"}, null, null, null);List<ContactInfo> list = new ArrayList<ContactInfo>();while(cursor.moveToNext()){String id = cursor.getString(0);System.out.println("id : " + id );// 要准备 一个ContactInfo类的实例, 去封装 数据了ContactInfo info = new ContactInfo();Cursor dataCursor = resolver.query(datatUri, new String[]{"data1","mimetype"}, "raw_contact_id=?", new String[]{id}, null);while(dataCursor.moveToNext()){String data = dataCursor.getString(0);String type = dataCursor.getString(1);if("vnd.android.cursor.item/email_v2".equals(type)){info.setEmail(data);}else if("vnd.android.cursor.item/im".equals(type)){info.setIm(data);}else if("vnd.android.cursor.item/name".equals(type)){info.setName(data);}else if("vnd.android.cursor.item/phone_v2".equals(type)){info.setPhone(data);}else if("vnd.android.cursor.item/photo".equals(type)){info.setPhoto(data);}}dataCursor.close();//将联系人 添加到 list 中去list.add(info);System.out.println("========");}cursor.close();return list;}public class ContactInfo {private String name; //private String phone; //private String email; //private String photo; //private String status;private String im; // 即时通讯号public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPhoto() {return photo;}public void setPhoto(String photo) {this.photo = photo;}public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public String getIm() {return im;}public void setIm(String im) {this.im = im;}@Overridepublic String toString() {return "ContactInfo [name=" + name + ", phone=" + phone + ", email="+ email + ", im=" + im + "]"+",photo="+photo;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。