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

来源:互联网 发布:尼泊尔弯刀数据图纸 编辑:程序博客网 时间:2024/06/06 07:32

背景描述

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

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

如果会话列表有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~~
渣渣程序员慢慢爬中。。。
阅读全文
0 0