package com.application.zhangshi_app_android.ui.function; import android.Manifest; import android.content.ContentResolver; import android.content.ContentUris; import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract; import android.view.View; import com.android.app_base.base.dialog.BaseDialog; import com.android.app_base.base.dialog.TipsDialog; import com.android.app_base.base.dialog.UIDialog; import com.android.app_base.base.dialog.WaitDialog; import com.android.app_base.base.view.BaseActivity; import com.android.app_base.manager.UserManager; import com.android.app_base.utils.ToastUtils; import com.android.app_base.utils.rxbus.MessageEvent; import com.android.app_base.utils.rxbus.RxBus; import com.android.app_base.widget.LinearItemDecoration; import com.application.zhangshi_app_android.BR; import com.application.zhangshi_app_android.R; import com.application.zhangshi_app_android.adapter.ContactsRvAdapter; import com.application.zhangshi_app_android.bean.ContactsBean; import com.application.zhangshi_app_android.bean.ContactsDetailBean; import com.application.zhangshi_app_android.databinding.ActivityContactsImportBinding; import com.blankj.utilcode.util.PermissionUtils; import com.hjq.bar.TitleBar; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; /** * @author Ljj * @date 2023.08.01. 13:44 * @desc 通讯录导入 Activity */ public class ContactsImportActivity extends BaseActivity { private ContactsRvAdapter adapter; private BaseDialog mWaitDialog; @Override public int getLayoutId() { return R.layout.activity_contacts_import; } @Override public int getVariableId() { return BR.viewModel; } @Override public void initParam() { } @Override public void initView() { //下拉刷新布局 binding.refreshLayout.setEnableRefresh(false); binding.refreshLayout.setEnableLoadMore(false); binding.refreshLayout.setEnableOverScrollDrag(true); binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { }); //recyclerView适配器 adapter = new ContactsRvAdapter(this); LinearItemDecoration itemDecoration = new LinearItemDecoration(); itemDecoration.setBottomSpace((int) getResources().getDimension(com.android.app_base.R.dimen.dp_12)); itemDecoration.setHorizontalSpace((int) getResources().getDimension(com.android.app_base.R.dimen.dp_20)); itemDecoration.setFirstTop((int) getResources().getDimension(com.android.app_base.R.dimen.dp_20)); binding.recyclerView.addItemDecoration(itemDecoration); binding.recyclerView.setAdapter(adapter); binding.ivOperate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { List list = adapter.getData(); if (list == null || list.size() == 0) { return; } UIDialog.Builder builder = new UIDialog.Builder(ContactsImportActivity.this); builder.setTitle("提示"); builder.setContent("是否导入所有通讯录数据?"); builder.setCancel("取消"); builder.setConfirm("导入"); builder.setListener(new UIDialog.OnListener() { @Override public void onConfirm(BaseDialog dialog) { viewModel.addContacts(list.get(0).getContactsDetailBeans()); } }); builder.show(); } }); } @Override public void initData() { UserManager.getInstance().getPermissions(new PermissionUtils.SimpleCallback() { @Override public void onGranted() { List list = new ArrayList<>(); new Thread(new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { dataLoading(); } }); // 获取ContentResolver对象 ContentResolver contentResolver = getContentResolver(); // 查询联系人数据,返回一个Cursor对象 Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cursor == null || cursor.getCount() == 0) { return; } // 遍历Cursor对象,获取联系人信息 while (cursor.moveToNext()) { ContactsDetailBean contactsDetailBean = new ContactsDetailBean(); contactsDetailBean.setMyName(UserManager.getInstance().getUserName()); // 获取联系人ID String id = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID)); // 获取联系人姓名 String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); contactsDetailBean.setName(name); // 查询昵称信息 Cursor nicknameCursor = contentResolver.query( ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?", new String[]{id, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE}, null ); if (nicknameCursor != null && nicknameCursor.moveToNext()) { String nickname = nicknameCursor.getString(nicknameCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Nickname.NAME)); contactsDetailBean.setNickName(nickname); nicknameCursor.close(); } // 查询工作单位 Cursor organizationCursor = contentResolver.query( ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?", new String[]{id, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE}, null ); String company = null; if (organizationCursor != null && organizationCursor.moveToNext()) { company = organizationCursor.getString(organizationCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Organization.COMPANY)); contactsDetailBean.setWork(company); organizationCursor.close(); } // 获取联系人电话号码 Cursor phoneCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, null, null); while (phoneCursor.moveToNext()) { String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); contactsDetailBean.setPhone(phoneNumber); } phoneCursor.close(); // 查询联系人的IM(即时通讯)账号信息 Cursor imCursor = contentResolver.query( ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?", new String[]{id, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE}, null ); if (imCursor != null && imCursor.getCount() > 0) { while (imCursor.moveToNext()) { String imAccount = imCursor.getString(imCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Im.DATA)); int imProtocol = imCursor.getInt(imCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Im.PROTOCOL)); // 获取IM账号类型标签 String imLabel = imCursor.getString(imCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Im.LABEL)); if (imProtocol == ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ) { contactsDetailBean.setQq(imAccount); } if (imLabel != null) { if (imLabel.contains("QQ") || imLabel.contains("qq")){ contactsDetailBean.setQq(imAccount); }else if (imLabel.contains("微信") || imLabel.contains("wechat") || imLabel.contains("WeChat") || imLabel.contains("wx")){ contactsDetailBean.setWx(imAccount); }else if (imLabel.contains("推特") || imLabel.contains("Twitter") || imLabel.contains("twitter")){ contactsDetailBean.setTwitter(imAccount); } } } imCursor.close(); } // 查询联系人的备注信息 Cursor noteCursor = getContentResolver().query( ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?", new String[]{id, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE}, null ); if (noteCursor != null && noteCursor.moveToFirst()) { String note = noteCursor.getString(noteCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Note.NOTE)); contactsDetailBean.setRemark(note); noteCursor.close(); } // 获取联系人头像 String photoId = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.PHOTO_ID)); if (photoId != null) { Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, Long.parseLong(photoId)); String mimeType = getContentResolver().getType(photoUri); contactsDetailBean.setUrl(photoUri.toString()); // 获取联系人头像 的字节数据,用于将图片上传服务器 // 打开头像 Uri,获取输入流 InputStream inputStream = null; try { inputStream = contentResolver.openInputStream(photoUri); // 将输入流转换成字节数组 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { byteArrayOutputStream.write(buffer, 0, bytesRead); } byte[] photoData = byteArrayOutputStream.toByteArray(); contactsDetailBean.setPhotoData(photoData); // 关闭输入流和字节数组输出流 inputStream.close(); byteArrayOutputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } } // 获取联系人邮箱 Cursor emailCursor = contentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + id, null, null); while (emailCursor.moveToNext()) { String email = emailCursor.getString(emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.DATA)); } emailCursor.close(); list.add(contactsDetailBean); } cursor.close(); runOnUiThread(new Runnable() { @Override public void run() { if (list.size() > 0){ dataFinish(); ContactsBean contactsBean = new ContactsBean(); contactsBean.setContactsDetailBeans(list); contactsBean.setMyName("手机本地"); adapter.addItem(contactsBean); }else{ dataNull(); } } }); } }).start(); } @Override public void onDenied() { ToastUtils.showShort("请开启获取通讯录权限"); } }, Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS); } @Override public void initLiveDataObserve() { } @Override protected void dataNull() { super.dataNull(); binding.layoutDataNull.setVisibility(View.VISIBLE); binding.refreshLayout.setVisibility(View.GONE); } @Override protected void dataError() { super.dataError(); binding.layoutDataNull.setVisibility(View.VISIBLE); binding.tvDataNull.setText("没有权限,请开启获取通讯录权限"); binding.refreshLayout.setVisibility(View.GONE); } @Override protected void dataLoading() { if (mWaitDialog == null) { mWaitDialog = new WaitDialog.Builder(this) // 消息文本可以不用填写 .setMessage("加载数据中...") .create(); } if (!mWaitDialog.isShowing()) { mWaitDialog.show(); } } @Override protected void dataFinish() { if (mWaitDialog != null && mWaitDialog.isShowing()) { mWaitDialog.dismiss(); mWaitDialog = null; } binding.ivOperate.setVisibility(View.VISIBLE); } @Override protected void dialogLoading() { if (mWaitDialog == null) { mWaitDialog = new WaitDialog.Builder(this) // 消息文本可以不用填写 .setMessage("导入中...") .create(); } if (!mWaitDialog.isShowing()) { mWaitDialog.show(); } } @Override protected void dialogDismiss() { if (mWaitDialog != null && mWaitDialog.isShowing()) { mWaitDialog.dismiss(); mWaitDialog = null; } } @Override public void onLeftClick(TitleBar titleBar) { finish(); } }