从上篇博客中,我们获取了短信会话表中的会话_id,接下来就是实现通过短信会话表中的_id 来获取短信详情,代码如下:
public static List<ModelMessage> getMsgDetailsByIDAndThreadID(Context mContext , String _ID ){
//ModelMessage 请实现自己的model
List<ModelMessage> result = new ArrayList<>();
try {
if(!TextUtils.isEmpty(_ID)){
//这里是获取短信列表的详情
result.addAll(getMessageByIDSMS(mContext , _ID));
}
if(!TextUtils.isEmpty(_ID)){
//这里是获取彩信列表的详情
result.addAll(getMessageByIDMMS(mContext , _ID));
}
Collections.sort(result, new Comparator<ModelMessage>() {
@Override
public int compare(ModelMessage o1, ModelMessage o2) {
//这里需要根据时间来进行排序,请自行解决
// if(o1.date > o2.date){
// return 1;
// }else if(o1.date < o2.date){
// return -1;
// }
return 0;
}
});
}catch (Exception e){
e.printStackTrace();
}
return result;
}
//获取短信的详细信息
private static List<ModelMessage> getMessageByIDSMS(Context mContext, String _ID){
List<ModelMessage> result = new ArrayList<>();
Cursor mCursor = null;
try {
Uri SMS_INBOX = Uri.parse("content://sms/");//"content://sms/"
ContentResolver cr = mContext.getContentResolver();
String selection = "thread_id = ?";
String[] selectionArgs = {String.valueOf(_ID)};
String[] SMS_PROJECTION = {
"_id",
"body",
"type",
"date"
};
mCursor = cr.query(SMS_INBOX, SMS_PROJECTION, selection, selectionArgs, "date desc");
if(mCursor != null){
while (mCursor.moveToNext()){
String id = mCursor.getString(0);//该条短信的id
String body = mCursor.getString(1);//该条短信的内容
int type = mCursor.getInt(2);//该条短信的类型,2为发送,1为接受
long date = mCursor.getLong(3);//该条短信发送或接受的日期
}
}else{
Log.e(TAG , "getMessageByIDSMS : mCursor : is null :");
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(mCursor != null){
mCursor.close();
}
}
return result;
}
//通过_ID获取彩信的信息
public static List<ModelMessage> getMessageByIDMMS(Context mContext , String _ID){
List<ModelMessage> mList = new ArrayList<>();
if(mContext == null || TextUtils.isEmpty(_ID)){
return mList;
}
Cursor mCursor = null;
try {
// Uri mMMSUri = Telephony.Mms.CONTENT_URI;
Uri mMMSUri = Uri.parse("content://mms");
mCursor = mContext.getContentResolver().query(mMMSUri , new String[]{"*"} ,
"thread_id = ?" , new String[]{_ID} , "date DESC");
if(mCursor != null){
//这里需要添加彩信的model 请自己实现
while (mCursor.moveToNext()){
String mmsID = mCursor.getString(mCursor.getColumnIndex("_id"));//短信的id
String msgSub = mCursor.getString(mCursor.getColumnIndex("sub"));
try {
if(!TextUtils.isEmpty(msgSub)){
//彩信附件的主题
msgSub = new String(msgSub.getBytes("ISO8859_1"), "UTF-8");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
int msg_box = mCursor.getInt(mCursor.getColumnIndex("msg_box"));
//1 代表收件箱
if(msg_box != 1){
}else{
}
//彩信发送的时间需要测试后发现测试的手机都乘以1000,
long date = mCursor.getLong(mCursor.getColumnIndex("date")) * 1000;
getMMSData(mContext , mmsID );//这里是获取彩信的详细内容
}
}else{
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(mCursor != null){
mCursor.close();
}
}
return mList;
}
//该方法是获取一条彩信的所有内容,包括多张图片或者多行文字,记得需要用集合存起来,并且判断图片或者文字类型
private static void getMMSData(Context mContext, String mmsID ){
if(!TextUtils.isEmpty(mmsID)){
String selectionPart = "mid=" + mmsID;
Uri uri = Uri.parse("content://mms/part");
Cursor cPart = null;
try{
cPart = mContext.getContentResolver().query(uri, new String[] {"*"}, selectionPart, null, null);
if(cPart != null) {
if (cPart.moveToFirst()) {
while(cPart.moveToNext()) {
String partId = cPart.getString(cPart.getColumnIndex("_id"));
String type = cPart.getString(cPart.getColumnIndex("ct"));
String _id = partId;
if ("image/jpeg".equals(type) || "image/bmp".equals(type) ||
"image/gif".equals(type) || "image/jpg".equals(type) ||
"image/png".equals(type)) {
Uri mMmsUri = getMmsImageUri(partId);//获取彩信图片的uri地址
}
if ("text/plain".equals(type)) {
String data = cPart.getString(cPart.getColumnIndex("_data"));
String body;
if (data != null) {
body = getMmsText(mContext , partId);
} else {
body = cPart.getString(cPart.getColumnIndex("text"));
}
}
}
}
}
}catch(Exception ex){
ex.printStackTrace();
}finally {
if(cPart != null){
cPart.close();
}
}
}
}
//获取彩信的内容
private static String getMmsText(Context mContext,String id) {
StringBuilder sb = new StringBuilder();
try {
Uri partURI = Uri.parse("content://mms/part/" + id);
InputStream is = null;
try {
is = mContext.getContentResolver().openInputStream(partURI);
if (is != null) {
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
BufferedReader reader = new BufferedReader(isr);
String temp = reader.readLine();
while (temp != null) {
sb.append(temp);
temp = reader.readLine();
}
}
} catch (IOException e) {}
finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {}
}
}
}catch (Exception e){
e.printStackTrace();
}
return sb.toString();
}
//根据partId获取图片的uri地址
private static Uri getMmsImageUri(String partId) {
return Uri.parse("content://mms/part/" + partId);
}
以上就是通过会话列表id获取短信,彩信详情方法。