android 短信查询、头像、联系人名称(支持会话和短信)__接上篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a396604593/article/details/78742178

背景描述

对于查询短信的功能,上篇文章已经有了初步的结果和显示。

但是有一个严重的问题就是,一直在嵌套查询。

如果会话列表有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();
            }
        }
        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~~
渣渣程序员慢慢爬中。。。

猜你喜欢

转载自blog.csdn.net/a396604593/article/details/78742178