package com.xxpatx.os.utils; import android.content.ContentProviderOperation; import android.content.ContentProviderResult; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.provider.ContactsContract; import android.text.TextUtils; import android.util.Log; import com.bumptech.glide.Glide; import com.xxpatx.os.R; import com.xxpatx.os.bean.Contact; import com.xxpatx.os.bean.ContactId; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableOnSubscribe; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; public class ContactsUtils { private static final String TAG = "ContactsUtils"; public static void saveContactPhone(Context context, Contact contact) { Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { long time = System.currentTimeMillis(); Log.e(TAG, "saveContactPhone: " + contact.getMobile() + " isExist = " + ContactsUtils.isExist(context, contact.getMobile())); if (TextUtils.isEmpty(contact.getAvatar())) { Bitmap bitmap = Glide.with(context).asBitmap().load(R.drawable.default_avatar).override(200, 200).submit().get(); if (ContactsUtils.isExist(context, contact.getMobile())) { updateContactPhone(context, contact, bitmap); } else { insertContactPhone(context, contact, bitmap); } } else { Bitmap bitmap = Glide.with(context).asBitmap().load(contact.getAvatar()).override(200, 200).error(R.drawable.default_avatar).submit().get(); if (ContactsUtils.isExist(context, contact.getMobile())) { updateContactPhone(context, contact, bitmap); } else { insertContactPhone(context, contact, bitmap); } } emitter.onNext(System.currentTimeMillis() - time); } }).subscribeOn(Schedulers.io()) .observeOn(Schedulers.newThread()) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { Log.e("saveContactPhone", "onSubscribe: "); } @Override public void onNext(@NonNull Long aLong) { Log.e("saveContactPhone", "onNext: " + aLong); } @Override public void onError(@NonNull Throwable e) { Log.e("saveContactPhone", "onError: " + e.getMessage()); } @Override public void onComplete() { Log.e("saveContactPhone", "onComplete: "); } }); } public static void saveContactPhone(Context context, List contactList) { Log.e(TAG, "saveContactPhone: "); // List contactIdList = ContactsUtils.getLocalContacts(context); Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { long time = System.currentTimeMillis(); for (Contact contact : contactList) { if (TextUtils.isEmpty(contact.getMobile())) { continue; } Log.e(TAG, "saveContactPhone: " + contact.getMobile() + " isExist = " + ContactsUtils.isExist(context, contact.getMobile())); if (TextUtils.isEmpty(contact.getAvatar())) { Bitmap bitmap = Glide.with(context).asBitmap().load(R.drawable.default_avatar).override(200, 200).submit().get(); if (ContactsUtils.isExist(context, contact.getMobile())) { updateContactPhone(context, contact, bitmap); } else { insertContactPhone(context, contact, bitmap); } } else { Bitmap bitmap = Glide.with(context).asBitmap().load(contact.getAvatar()).override(200, 200).error(R.drawable.default_avatar).submit().get(); if (ContactsUtils.isExist(context, contact.getMobile())) { updateContactPhone(context, contact, bitmap); } else { insertContactPhone(context, contact, bitmap); } } } emitter.onNext(System.currentTimeMillis() - time); } }).subscribeOn(Schedulers.io()) .observeOn(Schedulers.newThread()) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { Log.e("saveContactPhone", "onSubscribe: "); } @Override public void onNext(@NonNull Long aLong) { Log.e("saveContactPhone", "onNext: " + aLong); } @Override public void onError(@NonNull Throwable e) { Log.e("saveContactPhone", "onError: " + e.getMessage()); } @Override public void onComplete() { Log.e("saveContactPhone", "onComplete: "); } }); } public static void insertContactPhone(Context context, Contact contact, Bitmap bitmap) { ContentValues values = new ContentValues(); long rawContactId = ContentUris.parseId(context.getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values)); Log.e(TAG, "insertContactPhone: rawContactId = " + rawContactId); ContentResolver resolver = context.getContentResolver(); values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.getName()); resolver.insert(ContactsContract.Data.CONTENT_URI, values); values.clear(); values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); ByteArrayOutputStream out = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, out.toByteArray()); resolver.insert(ContactsContract.Data.CONTENT_URI, values); values.clear(); values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getMobile()); values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); resolver.insert(ContactsContract.Data.CONTENT_URI, values); } public static void insertContactPhone(Context context, Contact contact) { ContentValues values = new ContentValues(); long rawContactId = ContentUris.parseId(context.getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values)); Log.e(TAG, "insertContactPhone: rawContactId = " + rawContactId); ContentResolver resolver = context.getContentResolver(); values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.getName()); resolver.insert(ContactsContract.Data.CONTENT_URI, values); values.clear(); values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getMobile()); values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); resolver.insert(ContactsContract.Data.CONTENT_URI, values); } public static void updateContactPhone(Context context, Contact contact, Bitmap bitmap) { long rawContactId = ContactsUtils.getRawContactId(context, contact.getMobile()); Log.e(TAG, "updateContactPhone: rawContactId = " + rawContactId); ContentResolver resolver = context.getContentResolver(); ContentValues values = new ContentValues(); values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.getName()); resolver.insert(ContactsContract.Data.CONTENT_URI, values); values.clear(); values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); ByteArrayOutputStream out = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, out.toByteArray()); resolver.insert(ContactsContract.Data.CONTENT_URI, values); values.clear(); // values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); // values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); // values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getMobile()); // values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); // resolver.insert(ContactsContract.Data.CONTENT_URI, values); // Log.e(TAG, "updateContactPhone: phoneValues = " + // resolver.update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data.RAW_CONTACT_ID + "='" + rawContactId+"'", null)); // String selection = ContactsContract.Data.CONTACT_ID + "=" + contacts.getContactId() + " AND " + Data.MIMETYPE + "='" + StructuredName.CONTENT_ITEM_TYPE + "'"; // ContentValues values = new ContentValues(); // values.put(StructuredName.DISPLAY_NAME, contacts.getName()); // make sure getName() returns a String!!! // getContentResolver().update(Data.CONTENT_URI, values, selection, null); // ContentValues values = new ContentValues(); // values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name); // values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone); // Log.d("updateContact", "values已经产生"); // int result = resolver.update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data.RAW_CONTACT_ID + "=?", new String[]{String.valueOf(bean.getId())}); } public static void updateContactPhone(Context context, Contact contact) { long rawContactId = ContactsUtils.getRawContactId(context, contact.getMobile()); Log.e(TAG, "updateContactPhone: rawContactId = " + rawContactId); ContentResolver resolver = context.getContentResolver(); ContentValues values = new ContentValues(); values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.getName()); resolver.insert(ContactsContract.Data.CONTENT_URI, values); } public static void update(Context context, Contact contact, Bitmap bitmap) { long rawContactId = ContactsUtils.getRawContactId(context, contact.getMobile()); ArrayList ops = new ArrayList(); ContentProviderOperation op1 = ContentProviderOperation .newUpdate(ContactsContract.Data.CONTENT_URI) .withSelection( ContactsContract.Data.RAW_CONTACT_ID + "=? and " + ContactsContract.Data.MIMETYPE + "=?", new String[]{ String.valueOf(rawContactId), ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE}) .withValue( ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,// 对应data表中的data1字段 contact.getName()).build(); ops.add(op1); ContentProviderOperation op2 = ContentProviderOperation .newUpdate(ContactsContract.Data.CONTENT_URI) .withSelection( ContactsContract.Data.RAW_CONTACT_ID + "=? and " + ContactsContract.Data.MIMETYPE + "=?", new String[]{String.valueOf(rawContactId), ContactsContract.CommonDataKinds.Phone.MIMETYPE}) .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER,// 对应data表中的data1字段 contact.getMobile()).build(); ops.add(op2); // ContentProviderOperation op3 = ContentProviderOperation // .newUpdate(ContactsContract.Data.CONTENT_URI) // .withSelection( // ContactsContract.Data.RAW_CONTACT_ID + "=? and " // + ContactsContract.Data.MIMETYPE + "=?", // new String[]{String.valueOf(rawContactId), // ContactsContract.CommonDataKinds.Phone.MIMETYPE}) // .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS,// 对应data表中的data1字段 // "test@email.com").build(); ByteArrayOutputStream out = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); ContentProviderOperation op3 = ContentProviderOperation .newUpdate(ContactsContract.Data.CONTENT_URI) .withSelection( ContactsContract.Data.RAW_CONTACT_ID + "=? and " + ContactsContract.Data.MIMETYPE + "=?", new String[]{String.valueOf(rawContactId), ContactsContract.CommonDataKinds.Photo.MIMETYPE}) .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO,// 对应data表中的data1字段 out.toByteArray()).build(); ops.add(op3); try { ContentProviderResult[] contentProviderResults = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); Log.e(TAG, "update: " + Arrays.toString(contentProviderResults)); } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "update: " + e.getMessage()); } } public static void deleteContactPhone(Context context, Contact contact) { Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { deleteRawContact(context, contact.getMobile()); emitter.onNext(0L); } }) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.newThread()) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { Log.e("deleteContactPhone", "onSubscribe: "); } @Override public void onNext(@NonNull Long aLong) { Log.e("deleteContactPhone", "onNext: " + aLong); } @Override public void onError(@NonNull Throwable e) { Log.e("deleteContactPhone", "onError: " + e.getMessage()); } @Override public void onComplete() { Log.e("deleteContactPhone", "onComplete: "); } }); } public static void deleteRawContact(Context context, String phoneNum) { ContentResolver resolver = context.getContentResolver(); Cursor cursor = null; try { cursor = resolver.query(ContactsContract.Data.CONTENT_URI, new String[]{ContactsContract.Data.RAW_CONTACT_ID, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME}, ContactsContract.CommonDataKinds.Phone.NUMBER + "=?", new String[]{phoneNum}, null); if (cursor.moveToFirst()) { long rawContactId = cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Data.RAW_CONTACT_ID)); Log.e(TAG, "deleteRawContact: rawContactId = " + rawContactId); // int idCode = resolver.delete(ContactsContract.Contacts.CONTENT_URI, ContactsContract.Contacts._ID + " =?", new String[]{String.valueOf(rawContactId)}); // Log.e(TAG, "deleteRawContact: idCode = " + idCode); // int phoneCode = resolver.delete(ContactsContract.Data.CONTENT_URI, ContactsContract.CommonDataKinds.Phone.NUMBER + "=?", new String[]{phoneNum}); // Log.e(TAG, "deleteRawContact: phoneCode = " + phoneCode); // int contactIdCode = resolver.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts.CONTACT_ID + " =?", new String[]{String.valueOf(rawContactId)}); // Log.e(TAG, "deleteRawContact: contactIdCode = " + contactIdCode); // String name // int nameCode = resolver.delete(ContactsContract.RawContacts.CONTENT_URI, "display_name=?", new String[]{name}); // Log.e(TAG, "deleteRawContact: nameCode = " + nameCode); int result = resolver.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts._ID + "=?", new String[]{String.valueOf(rawContactId)}); Log.e(TAG, "deleteRawContact: result = " + result); } } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "deleteRawContact: " + e.getMessage()); } finally { if (cursor != null) { cursor.close(); } } } public static long getRawContactId(Context context, String phoneNum) { ContentResolver resolver = context.getContentResolver(); Cursor cursor = null; try { cursor = resolver.query(ContactsContract.Data.CONTENT_URI, new String[]{ContactsContract.Data.RAW_CONTACT_ID, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME}, ContactsContract.CommonDataKinds.Phone.NUMBER + "=?", new String[]{phoneNum}, null); if (cursor.moveToFirst()) { long rawContactId = cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Data.RAW_CONTACT_ID)); Log.e(TAG, "getRawContactId: rawContactId = " + rawContactId); return rawContactId; } } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "deleteRawContact: " + e.getMessage()); } finally { if (cursor != null) { cursor.close(); } } return -1; } /** * 添加联系人信息 */ public static void insertConstacts(Context context, String name, String phone, List list) { long contactId = getContactId(context, name); if (contactId == -1) { ContentResolver resolver = context.getContentResolver(); //插入raw_contacts表,并获取_id属性 ContentValues nameValues = new ContentValues(); long rawContactId = ContentUris.parseId(resolver.insert(ContactsContract.RawContacts.CONTENT_URI, nameValues)); //插入data表 //add Name nameValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); nameValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); nameValues.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name); resolver.insert(ContactsContract.Data.CONTENT_URI, nameValues); try { //写入头像 Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.default_avatar); ByteArrayOutputStream out = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); ContentValues photoValues = new ContentValues(); photoValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); photoValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); photoValues.put(ContactsContract.CommonDataKinds.Photo.PHOTO, out.toByteArray()); context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, photoValues); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } ContentValues phoneValues = new ContentValues(); //写入手机号码 phoneValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); phoneValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); phoneValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone); phoneValues.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); //插入data表 context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, phoneValues); } } /** * 判断某个手机号是否存在 */ public static boolean isThePhoneExist(Context context, String phoneNum) { //uri= content://com.android.contacts/data/phones/filter/# Cursor cursor = null; try { Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + phoneNum); ContentResolver resolver = context.getContentResolver(); cursor = resolver.query(uri, new String[]{ContactsContract.Data.DISPLAY_NAME}, null, null, null); //从raw_contact表中返回display_name for (String columnName : cursor.getColumnNames()) { Log.e("isThePhoneExist: ", columnName); } while (cursor.moveToNext()) { for (String columnName : cursor.getColumnNames()) { Log.e("isThePhoneExist: ", columnName); Log.e("isThePhoneExist: ", cursor.getColumnIndex(columnName) + ""); if (cursor.getColumnIndex(columnName) != -1) { Log.e("isThePhoneExist: getString = ", " - " + cursor.getString(cursor.getColumnIndex(columnName))); } } } if (cursor.moveToFirst()) { //Log.i(TAG, "name=" + cursor.getString(0) + " , phoneNum = " + phoneNum); cursor.close(); return true; } } catch (Exception e) { //Log.i(TAG, "163 e =" + e.getMessage()); e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); } } return false; } /** * 获取所有联系人信息 */ // public static List getAllSysContacts(Context context) { // List list = new ArrayList<>(); // try { // ContentResolver resolver = context.getContentResolver(); // SysContactsListBean sysContactsListBean; // Uri uri = Uri.parse("content://com.android.contacts/data/phones"); // // Cursor cursor1 = resolver.query(uri, // new String[]{ContactsContract.Data.RAW_CONTACT_ID, // ContactsContract.Data.DISPLAY_NAME, // ContactsContract.CommonDataKinds.Phone.NUMBER}, // null, null, null); // // while (cursor1.moveToNext()) { // sysContactsListBean = new SysContactsListBean(); // sysContactsListBean.setCustomerId(cursor1.getLong(0)); // sysContactsListBean.setCustomerName(cursor1.getString(1)); // sysContactsListBean.setPhoneNumber(cursor1.getString(2)); // list.add(sysContactsListBean); // } // } catch (Exception e) { // e.printStackTrace(); // } // // if (!CollectorUtils.isEmpty(list)) { // Collections.sort(list, new Comparator() { // @Override // public int compare(SysContactsListBean o1, SysContactsListBean o2) { // return o2.getCustomerName().compareTo(o1.getCustomerName()); // } // }); // } // return list; // } public static void getContacts(Context context) { //https://blog.csdn.net/luofeixiongsix/article/details/48849511 //查询raw_contacts表获得联系人 ContentResolver resolver = context.getContentResolver(); // Uri uri = ContactsContract.Data.CONTENT_URI;//content://com.android.contacts/data 有电话+86 // Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;//content://com.android.contacts/data/phones 有电话+86 // Uri uri = ContactsContract.RawContacts.CONTENT_URI;//content://com.android.contacts/raw_contacts 无电话 Uri uri = ContactsContract.Contacts.CONTENT_URI;//content://com.android.contacts/contacts 无电话 Log.e(TAG, "getContacts: " + uri.toString()); //查询联系人 Cursor cursor1 = resolver.query(ContactsContract.Data.CONTENT_URI, null, null, null, null); Log.e("getContacts: cursor1 = ", Arrays.toString(cursor1.getColumnNames())); Cursor cursor2 = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); Log.e("getContacts: cursor2 = ", Arrays.toString(cursor1.getColumnNames())); Cursor cursor3 = resolver.query(ContactsContract.RawContacts.CONTENT_URI, null, null, null, null); Log.e("getContacts: cursor3 = ", Arrays.toString(cursor1.getColumnNames())); Cursor cursor4 = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); Log.e("getContacts: cursor4 = ", Arrays.toString(cursor1.getColumnNames())); // while (cursor.moveToNext()) { // String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); // String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); // Log.e(TAG, "getContacts: 联系人:" + name); // Log.e(TAG, "getContacts: 电话:" + number); // } // for (String columnName : cursor.getColumnNames()) { // Log.e("getContacts: ", columnName); // } // while (cursor.moveToNext()) { // for (String columnName : cursor.getColumnNames()) { // Log.e("getContacts: ", cursor.getColumnIndex(columnName) + "\t" + columnName); // if (cursor.getColumnIndex(columnName) != -1) { // Log.e("getContacts: getString =", " " + cursor.getString(cursor.getColumnIndex(columnName))); // } // } // } // cursor.close(); } @Deprecated public static List getLocalContacts(Context context) { ContentResolver resolver = context.getContentResolver(); Uri uri = ContactsContract.Contacts.CONTENT_URI; Cursor cursor = resolver.query(uri, null, null, null, null); List contactIds = new ArrayList<>(); while (cursor.moveToNext()) { long id = cursor.getLong(cursor.getColumnIndexOrThrow("name_raw_contact_id")); int in_phone = cursor.getInt(cursor.getColumnIndexOrThrow("indicate_phone_or_sim_contact")); String display_name = cursor.getString(cursor.getColumnIndexOrThrow("display_name")); String photo_uri = cursor.getString(cursor.getColumnIndexOrThrow("photo_uri")); ContactId contactId = new ContactId(id, in_phone, display_name, photo_uri); contactIds.add(contactId); } cursor.close(); List filter = contactIds.stream().filter(new Predicate() { @Override public boolean test(ContactId contactId) { return contactId.getInPhone() == -1; } }).collect(Collectors.toList()); Log.e(TAG, "getLocalContacts: " + filter); return filter; } /** * 判断某个手机号是否存在 */ public static boolean isExist(Context context, String phoneNum) { //uri= content://com.android.contacts/data/phones/filter/# Cursor cursor = null; try { Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + phoneNum); ContentResolver resolver = context.getContentResolver(); cursor = resolver.query(uri, new String[]{ContactsContract.Data.DISPLAY_NAME}, null, null, null); //从raw_contact表中返回display_name if (cursor.moveToFirst()) { cursor.close(); return true; } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); } } return false; } /** * @param context * @param phoneNum * @return 获取联系人id */ public static long getContactId(Context context, String phoneNum) { Cursor cursor = null; try { Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + phoneNum); ContentResolver resolver = context.getContentResolver(); cursor = resolver.query(uri, null, null, null, null); //从raw_contact表中返回display_name if (cursor.moveToFirst()) { for (String columnName : cursor.getColumnNames()) { Log.e("getContactId: ", cursor.getColumnIndex(columnName) + "\t" + columnName); if (cursor.getColumnIndex(columnName) != -1) { Log.e("getContactId: getString =", " " + cursor.getString(cursor.getColumnIndex(columnName))); } } return cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Data.CONTACT_ID)); } cursor.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); } } return -1; } }