package com.roboo.like.google.async;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.Photo;
import android.provider.MediaStore.Images.Media;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import com.roboo.like.google.models.SmsItem;
public class SmsAsyncTaskLoader extends BaseAsyncTaskLoader<LinkedList<SmsItem>>
{
private static final String CHINA_GSM="+86";
private static String SELF_PHONENUMBER = null;
private static final String NO_NAME = "无名氏";
protected static final Uri SMS_ALL = Uri.parse("content://sms/");// 所有的
protected static final Uri SMS_INBOX = Uri.parse("content://sms/inbox");// 收件箱
private Context mContext;
public SmsAsyncTaskLoader(Context context)
{
super(context);
this.mContext = context;
TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
SELF_PHONENUMBER = telephonyManager.getLine1Number();
if(!TextUtils.isEmpty(SELF_PHONENUMBER))
{
if(SELF_PHONENUMBER.contains(CHINA_GSM))
{
SELF_PHONENUMBER = SELF_PHONENUMBER.substring(CHINA_GSM.length()+SELF_PHONENUMBER.indexOf(CHINA_GSM));
}
}
if(mDebug)
{
System.out.println("我的手机号码 = "+ SELF_PHONENUMBER);
}
}
public LinkedList<SmsItem> loadInBackground()
{
LinkedList<SmsItem> data = getSms();
mEndTime = System.currentTimeMillis();
if (mEndTime - mStartTime < THREAD_LEAST_DURATION_TIME)
{
try
{
Thread.sleep(THREAD_LEAST_DURATION_TIME);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
return data;
}
private LinkedList<SmsItem> getSms()
{
LinkedList<SmsItem> items = null;
ContentResolver resolver = mContext.getContentResolver();
String[] infos = new String[] { "_id", "address", "person", "body", "date", "type" };
Cursor cursor = resolver.query(SMS_ALL, infos, null, null, "date DESC");
if (cursor != null && cursor.getCount() > 0)
{
items = new LinkedList<SmsItem>();
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
{
SmsItem item = new SmsItem();
item.phoneNumber = cursor.getString(1);
item.name = cursor.getString(2);
item.body = cursor.getString(3);
item.date = cursor.getString(4);
item.type = cursor.getString(5);
if ((!TextUtils.isEmpty(item.date)) && TextUtils.isDigitsOnly(item.date))
{
item.date = handleDate(item.date);
}
item.type = handleType(item.type, item);
if (!TextUtils.isEmpty(item.name))
{
item.name = handleName(item.name, item);
}
items.add(item);
mDebug = true;
if (mDebug)
{
System.out.println("item = 【" + item + " 】");
}
}
}
return items;
}
/**
* 处理获取姓名, 并且获取对应的头像信息
*
* @param name
* @param item
* 对象列表项
* @return
*/
private String handleName(String name, SmsItem item)
{
String photoUri = null;
ContentResolver resolver = mContext.getContentResolver();
String[] strings = new String[] { Phone.DISPLAY_NAME, Photo.PHOTO_THUMBNAIL_URI };
Cursor phoneCursor = resolver.query(Phone.CONTENT_URI, strings, "name_raw_contact_id =?", new String[] { name }, null);// 获取手机联系人
name = NO_NAME;
if (phoneCursor != null && phoneCursor.getCount() > 0)
{
phoneCursor.moveToFirst();
name = phoneCursor.getString(0);
if (TextUtils.isEmpty(name))
{
name = NO_NAME;
}
photoUri = phoneCursor.getString(1);
if (!TextUtils.isEmpty(photoUri))
{
if (mDebug)
{
System.out.println("photoUri = " + photoUri);
}
try
{
Bitmap bitmap = Media.getBitmap(mContext.getContentResolver(), Uri.parse(photoUri));
if (null != bitmap)
{
item.bitmap = bitmap;
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
return name;
}
private String handleType(String type, SmsItem item)
{
if (Integer.parseInt(type) == 1)// 已发送
{
type = "已接收";
}
else if (Integer.parseInt(type) == 2)
{
type = "已发送";
if (!TextUtils.isEmpty(SELF_PHONENUMBER))
{
item.phoneNumber = SELF_PHONENUMBER;
}
}
return type;
}
/**
* 将时间处理成想要的格式
*
* @param date
* 要处理的时间
* @return 处理后的时间
*/
private String handleDate(String date)
{
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM月dd日");
return simpleDateFormat.format(new Date(Long.parseLong(date)));
}
}
/*
* 关于content://sms/inbox表,大致包含的域有: _id | 短消息序号 如100 thread_id | 对话的序号 如100 address | 发件人地址,手机号.如+8613811810000 person | 发件人,返回一个数字就是联系人列表里的序号,陌生人为null date | 日期 long型。如1256539465022 protocol | 协议 0 SMS_RPOTO, 1 MMS_PROTO read | 是否阅读 0未读, 1已读 status | 状态 -1接收,0 complete, 64 pending, 128 failed type |
* 类型 1是接收到的,2是已发出 body | 短消息内容 service_center | 短信服务中心号码编号。如+8613800755500
*/
/*
* content://sms/ 所有短信 content://sms/inbox 收件箱 content://sms/sent 已发送 content://sms/draft 草稿 content://sms/outbox 发件箱 content://sms/failed 发送失败 content://sms/queued 待发送列表
*/