android 短信查询、头像、联系人名称(支持会话和短信)__接上篇
2017-12-07 15:53
323 查看
背景描述
对于查询短信的功能,上篇文章已经有了初步的结果和显示。但是有一个严重的问题就是,一直在嵌套查询。
如果会话列表有100个,那我就需要查询其他对应的表一百次。。。三个表就是三百次
会相当耗时并且一直占用数据库
为了更快的拿到数据,我的想法是一次性从表中拿到所有的数据,然后这时候只需要查询四次;然后自己根据id或者唯一标示进行数据的拼装
代码
public class SmsHelp { private static final String TAG="SmsHelp"; public static String THREAD_TYPE="1"; public static String SMS_TYPE="2"; private static class THREAD_Data{ //会话id String threadId; //短信日期 String timeInMillis; //短信数量 String mmsCount; //最后的信息 String last_mms; //收件人 String recipient_ids; public THREAD_Data(String threadId, String timeInMillis, String mmsCount, String last_mms, String recipient_ids) { this.threadId = threadId; this.timeInMillis = timeInMillis; this.mmsCount = mmsCount; this.last_mms = last_mms; this.recipient_ids = recipient_ids; } @Override public String toString() { return "THREAD_Data{" + "threadId='" + threadId + '\'' + ", timeInMillis='" + timeInMillis + '\'' + ", mmsCount='" + mmsCount + '\'' + ", last_mms='" + last_mms + '\'' + ", recipient_ids='" + recipient_ids + '\'' + '}'; } } private static class SMS_Data{ String body; String date; String phoneNum; public SMS_Data(String body, String date, String phoneNum) { this.body = body; this.date = date; this.phoneNum = phoneNum; } } private static class Contacts_Data{ String id; String name; String phoneNum; public Contacts_Data(String id, String name, String phoneNum) { this.id = id; this.name = name; this.phoneNum = phoneNum; } @Override public String toString() { return "Contacts_Data{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", phoneNum=" + phoneNum + '}'; } } /** * 从mms数据库中检索threads表 */ public static ArrayList<SmsItem> getMmsMessage(Context context) { ContentResolver cr = context.getContentResolver(); ArrayList<THREAD_Data> thread_datas=new ArrayList<>(); Cursor cursor=null; try { cursor = cr.query(Telephony.Mms.CONTENT_URI, new String[] { "* from threads--" }, null, null, null); if (cursor!=null){ Log.i(TAG,"cursor: "+cursor.getCount()); while (cursor.moveToNext()) { int thread_id = cursor.getColumnIndex(Telephony.Mms._ID); int date = cursor.getColumnIndex(Telephony.Mms.DATE); int message_count = cursor.getColumnIndex(Telephony.ThreadsColumns.MESSAGE_COUNT); int snippet = cursor.getColumnIndex(Telephony.ThreadsColumns.SNIPPET); int recipient = cursor.getColumnIndex(Telephony.ThreadsColumns.RECIPIENT_IDS); //会话id String threadId = cursor.getString(thread_id); //短信日期 String timeInMillis = cursor.getString(date); //短信数量 String mmsCount = cursor.getString(message_count); //最后的信息 String last_mms = cursor.getString(snippet); //收件人 String recipient_ids = cursor.getString(recipient); THREAD_Data thread_data = new THREAD_Data(threadId, timeInMillis, mmsCount, last_mms, recipient_ids); thread_datas.add(thread_data); Log.i(TAG," thread_data: "+thread_data.toString() ); } } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor!=null){ cursor.close(); } } //查询出备用数据 HashMap<String, ArrayList<SMS_Data>> SMSDataMap = getSMS_Data(context); HashMap<String, ArrayList<String>> canonicalAddressesMap = getAllCanonicalAddresses(context); HashMap<String,Contacts_Data> contactsDataMap = getAllContacts_Data(context); //数据整合 ArrayList<SmsItem> threadDataList=new ArrayList<>(); ArrayList<SmsItem> smsDataList=new ArrayList<>(); if (thread_datas.size()>0){ for (THREAD_Data item:thread_datas) { if (item==null){ continue; } // 获得短信的各项内容 //手机号码 String phoneNum=""; //未读数量 int noReadCount=0; ArrayList<SMS_Data> sms_datas = SMSDataMap.get(item.threadId); if (sms_datas!=null){ for (int i=0;i<sms_datas.size();i++){ SMS_Data sms_data = sms_datas.get(i); phoneNum=sms_data.phoneNum; } } String phoneNumNew=null; String[] ids = item.recipient_ids.split(" "); for (int i = 0; i < ids.length; i++) { if (!TextUtils.isEmpty(ids[i])) { String id = ids[i]; ArrayList<String> strings = canonicalAddressesMap.get(id); String address=strings.get(0); if (!TextUtils.isEmpty(address)&&TextUtils.isEmpty(phoneNumNew)){ phoneNumNew=address; } } } if (TextUtils.isEmpty(phoneNum)&&!TextUtils.isEmpty(phoneNumNew)){ phoneNum=phoneNumNew; } //判断是否联系人 Contacts_Data contacts_data=null; Set<String> keySet = contactsDataMap.keySet(); for (String number:keySet) { boolean compare = PhoneNumberUtils.compare(number, phoneNum); if (compare){ contacts_data = contactsDataMap.get(number); } } //联系人姓名 String contactName =""; //联系人头像id String curPersonID=String.valueOf(-1); if (contacts_data!=null){ contactName = contacts_data.name; curPersonID=contacts_data.id; } // 获得最后的未读短信与已读短信 String final_count = "(" + noReadCount + "/" + item.mmsCount + ")"; //短信列表添加数据 Log.w(TAG," SMSDataMap: "+SMSDataMap.size()); //当前会话是否有短信内容 boolean threadHasBody=false; if (sms_datas!=null) { for (int i = 0; i < sms_datas.size(); i++) { SMS_Data sms_data = sms_datas.get(i); //有短信内容才去添加 if (!TextUtils.isEmpty(sms_data.body)){ threadHasBody=true; //有内容再add短信 SmsItem smsItem_sms=new SmsItem(); smsItem_sms.setThread_id(item.threadId); smsItem_sms.setType(SMS_TYPE); //boby和date与会话列表不同 smsItem_sms.setDate(sms_data.date); smsItem_sms.setSmsBody(sms_data.body); smsItem_sms.setName(contactName); smsItem_sms.setPhoneNumber(phoneNum); smsItem_sms.setContactId(curPersonID); //短信不需要显示数量 // smsItem_thread.setNoReadCount(noReadCount); // smsItem_thread.setMmsCount(mmsCount); // smsItem_thread.setFinalCount(final_count); smsItem_sms.getPinYinForSearch(); smsDataList.add(smsItem_sms); Log.d(TAG," smsItem_sms: "+smsItem_sms.toString()); } } } //有短信内容才去添加 if (threadHasBody){ //会话列表添加数据 SmsItem smsItem_thread=new SmsItem(); smsItem_thread.setThread_id(item.threadId); smsItem_thread.setType(THREAD_TYPE); smsItem_thread.setDate(item.timeInMillis); smsItem_thread.setSmsBody(item.last_mms); smsItem_thread.setName(contactName); smsItem_thread.setPhoneNumber(phoneNum); smsItem_thread.setContactId(curPersonID); //会话结果需要显示消息数量 smsItem_thread.setNoReadCount(String.valueOf(noReadCount)); smsItem_thread.setMmsCount(item.mmsCount); smsItem_thread.setFinalCount(final_count); smsItem_thread.getPinYinForSearch(); threadDataList.add(smsItem_thread); Log.i(TAG," smsItem_thread: "+smsItem_thread.toString()); } Log.e(TAG," thread_smsArrayList.clear();: "); } } Log.d(TAG," 111 threadDataList: "+threadDataList.size()+" smsDataList: "+smsDataList.size()); //合并会话列表和短信列表后返回 if (smsDataList.size()>0){ threadDataList.addAll(smsDataList); } Log.d(TAG," 222 threadDataList: "+threadDataList.size()+" smsDataList: "+smsDataList.size()); return threadDataList; } /** * 检索sms库, 获得所有的号码 * @return */ private static HashMap<String,ArrayList<SMS_Data>> getSMS_Data(Context context) { //所有短信的map HashMap<String,ArrayList<SMS_Data>> smsMap=new HashMap<>(); String[] projection = new String[] {Telephony.Sms.THREAD_ID, Telephony.Sms.ADDRESS,Telephony.Sms.BODY, Telephony.Sms.DATE}; Cursor cursor=null; try { cursor = context.getContentResolver().query(Telephony.Sms.CONTENT_URI, projection, null,null, null); if (cursor!=null){ while (cursor.moveToNext()) { //把所有短信根据会话id添加到map中 int thread_id = cursor.getColumnIndex(Telephony.Sms.THREAD_ID); String threadId = cursor.getString(thread_id); ArrayList<SMS_Data> smsArrayList=smsMap.get(threadId); if (smsArrayList==null){ smsArrayList=new ArrayList<>(); } int phoneNumber = cursor.getColumnIndex(Telephony.Sms.ADDRESS); String phoneNum = cursor.getString(phoneNumber); int bodyIndex = cursor.getColumnIndex(Telephony.Sms.BODY); int dateIndex = cursor.getColumnIndex(Telephony.Sms.DATE); String body = cursor.getString(bodyIndex); String date = cursor.getString(dateIndex); smsArrayList.add(new SMS_Data(body,date,phoneNum)); smsMap.put(threadId,smsArrayList); } } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor!=null){ cursor.close(); } } return smsMap; } /**联系人id和电话*/ private static HashMap<String,ArrayList<String>> getAllCanonicalAddresses(Context context) { HashMap<String,ArrayList<String>> smsMap=new HashMap<>(); Cursor cur=null; try { cur = context.getContentResolver().query(Telephony.Mms.CONTENT_URI,new String[] { " * from canonical_addresses " + " --" }, null, null, null);//where _id="+ id + " -- if (cur!=null){ if (cur.getCount() > 0) { while (cur.moveToNext()) { String _id = cur.getString(cur.getColumnIndex("_id")); ArrayList<String> phoneNum=smsMap.get(_id); if (phoneNum==null){ phoneNum=new ArrayList<>(); } String address = cur.getString(cur.getColumnIndex("address")); if (!TextUtils.isEmpty(address)&&!phoneNum.contains(address)){ phoneNum.add(address); } smsMap.put(_id,phoneNum); } } } } catch (Exception e) { e.printStackTrace(); } finally { if (cur!=null){ cur.close() b2b5 ; } } return smsMap; } /** * 获取联系人id 名称 号码 */ private static HashMap<String,Contacts_Data> getAllContacts_Data(Context context) { HashMap<String ,Contacts_Data> contactIdAndNameAndNumber=new HashMap<>(); // 获取所有联系人id和姓名 HashMap<String,String> contactIdAndName=new HashMap<>(); Cursor cursor=null; try { cursor = context.getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); contactIdAndName.put(contactId,name); } } // 获取所有联系人所有id和电话号 HashMap<String, Set<String>> allContactsNumber = ContactsHelp.getAllContactsNumber(context); if (contactIdAndName.size()>0&&allContactsNumber.size()>0){ Set<String> keySet = contactIdAndName.keySet(); for (String contactId:keySet) { String name = contactIdAndName.get(contactId); Set<String> phoneNumber = allContactsNumber.get(contactId); if (phoneNumber!=null&&phoneNumber.size()>0){ for (String number:phoneNumber) { Contacts_Data contacts_data = contactIdAndNameAndNumber.get(number); if (contacts_data!=null){ Log.e(TAG,"getContactNameFromPhoneNum oldDate contacts_data: "+contacts_data.toString()); Log.e(TAG,"getContactNameFromPhoneNum news? contactId: "+contactId+" name: "+name+" number: "+number); }else{ contacts_data=new Contacts_Data(contactId,name,number); contactIdAndNameAndNumber.put(number,contacts_data); } } } } } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor!=null){ cursor.close(); } } return contactIdAndNameAndNumber; } public static void startSmsSearchActivity(String searchText){ Intent clickIntent = new Intent(); clickIntent.setClassName("com.android.mms","com.gome.mms.ui.SearchActivity"); clickIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP |Intent.FLAG_ACTIVITY_CLEAR_TASK); clickIntent.putExtra("intent_extra_data_key",searchText); CustomPageManager.getInstance(null).startActivity(clickIntent); } }以上,就拿到了需要的数据。emmmmmmmmm......
后记
如果有更好的想法,欢迎留言交流,虽然我不经常写,但是看见的话一定会回复的 emmm~~渣渣程序员慢慢爬中。。。
相关文章推荐
- android 短信查询、头像、联系人名称(支持会话和短信)
- android 集成环信即时通讯 easeUI 联系人列表 会话列表 头像 昵称
- android 在新建短信时,加入名称为","(英文逗号)的联系人时,应用崩溃的修改
- android 在新建短信时,加入名称为","(英文逗号)的联系人时,应用崩溃的修改
- Androidの通过查询电话号码或ID获取联系人头像
- android 在新建短信时,加入名称为","(英文逗号)的联系人时,应用崩溃的修改
- android通过查询电话号码获取联系人头像
- android通过查询电话号码获取联系人头像
- android根据电话号码查询联系人名称,导出通讯录所有联系人的方法
- android根据电话号码查询联系人名称,导出通讯录所有联系人的方法
- android 4.4.3上面,联系人的头像默认显示首字母,但是不支持中文字符,修改支持中文
- android总结查询联系人和短信内容
- Android-插入/查询联系人/短信收到提醒(内容观察者)
- android 在新建短信时,加入名称为","(英文逗号)的联系人时,应用崩溃
- android根据电话号码查询联系人名称,导出通讯录所有联系人的方法
- android通过查询电话号码获取联系人头像
- Android 获取短信会话信息 .
- android分页查询获取系统联系人信息
- 【android】 短信彩信以及会话读取
- Android 获取手机联系人和手机短信和一个简单的yinyue