您的位置:首页 > 移动开发 > Android开发

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~~
渣渣程序员慢慢爬中。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐