Android-通讯录:获取短信会话列表(包括群发的)

网上很多列子都没有考虑到群发的时候。找了很久才找到

http://www.cnblogs.com/yangzhong/archive/2012/05/16/2504152.html

主要步骤:

1、 获取短信会话列表

2、根据获取到的会话列表中的recipient_ids 信息去canonical_addresses 中获取对应的地址信息。

 

package com.xx.readsms;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class ReadSmsActivity extends Activity {
    /** Called when the activity is first created. */
    private Context mContext; 
    private TextView tv;
    private static List<ContactInfo> list=new ArrayList<ContactInfo>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv=(TextView)this.findViewById(R.id.tv_test);
        getSMSInfo();
        tv.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                list.clear();
                System.out.println("=================1");
                getContacts_LastMessage();
                System.out.println("=================2");
                StringBuilder sb=new StringBuilder();
                if(list!=null){
                    System.out.println("=================3");
                    for (int i = 0; i < list.size(); i++) {
                        System.out.println("=================4:"+i);
                        ContactInfo tmp=new ContactInfo();
                        tmp=(ContactInfo)list.get(i);
                        sb.append("["+tmp.getContact()+",");
                        sb.append(tmp.getLast_mms()+",");
                        sb.append(tmp.getDate_mms()+",");
                        sb.append(getCanonicalAddresses(tmp.getRecipient())+",");//去canonical_addresses表获取接收者号码
                        sb.append(tmp.getFinal_count()+"]\n");
                    }
                    tv.setText("");
                    tv.setText(sb.toString());
                }
                else{
                    System.out.println("list is null");
                }
            }
        });
    }

    public String getCanonicalAddresses(String recipient_ids){
        String[] ids=recipient_ids.split(" ");
        System.out.println("recipient_ids:"+recipient_ids);
        String addressResult="";
        for (int i = 0; i < ids.length; i++) {
            Cursor cur=ReadSmsActivity.this.getContentResolver().query(Uri.parse("content://mms/"), 
                    new String[]{" * from canonical_addresses where _id="+ids[i].toString()+" --"}, null,null,null);
            if(cur.getCount()>0){
                while (cur.moveToNext()){
                    String _id=cur.getString(cur.getColumnIndex("_id"));
                    String address=cur.getString(cur.getColumnIndex("address"));
                    addressResult+="{"+_id+","+address+"}";
                }
            }
        }
        return addressResult;
    }

    /**
     * 从mms数据库中检索threads表 
     */
    public void getContacts_LastMessage()
    {
        ContentResolver cr = ReadSmsActivity.this.getContentResolver();
        Cursor cursor = cr.query(Uri.parse("content://mms/"), new String[]
                { "* from threads--" }, null, null, null);
        while (cursor.moveToNext())
        {
            int thread_id = cursor.getColumnIndex("_id");
            int date = cursor.getColumnIndex("date");
            int message_count = cursor.getColumnIndex("message_count");
            int snippet = cursor.getColumnIndex("snippet");
            int recipient=cursor.getColumnIndex("recipient_ids");

            //格式化短信日期显示
            SimpleDateFormat sfd = new SimpleDateFormat("MM-dd hh:mm:ss");
            Date date_format = new Date(Long.parseLong(cursor.getString(date)));
            String time = sfd.format(date_format);

            //获得短信的各项内容
            String info[]=getPhoneNum(cursor.getString(thread_id));
            String last_mms=cursor.getString(snippet);
            String date_mms=time;
            String count_mms=cursor.getString(message_count);
            String recipient_ids=cursor.getString(recipient);

            //判断是否联系人
            String contact = getContactNameFromPhoneNum(this.getApplicationContext(), info[0]);

            //获得最后的未读短信与已读短信
            String final_count="("+info[1]+"/"+count_mms+")";

            //添加到list
            if (contact.equals(""))
            {
                getData(
                        info[0], 
                        last_mms,
                        final_count,
                        date_mms,
                        recipient_ids
                        );
            }
            else 
            {
                getData(
                        contact, 
                        last_mms,
                        final_count,
                        date_mms,
                        recipient_ids
                        );
            }
        }

    }

    /**
     * 获取联系人信息
     * @param context
     * @param contactInfo
     * @return
     */
    public String getContactNameFromPhoneNum(Context context,String contactInfo){
        Long curPersonID;
        String contactNames = "";
        Uri uri = Uri.parse("content://com.android.contacts/phone_lookup/" + contactInfo);
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);  
        if(cursor.moveToFirst()){
            String contactName = cursor.getString(cursor.getColumnIndex("display_name"));  
            curPersonID = cursor.getLong(cursor.getColumnIndex("_id"));                            
            cursor.close();
            if(contactNames=="")
                contactNames = contactName;
            else
                contactNames = contactNames+","+contactName;
        }     
        return contactNames;
    }
    /**
     * 添加到列表
     * @param contact
     * @param last_mms
     * @param final_count
     * @param date_mms
     */
    public void getData(String contact,String last_mms,String final_count,String date_mms,String recipient_ids){
        ContactInfo c=new ContactInfo();
        if(contact!=null)    c.setContact(contact);
        if(date_mms!=null)    c.setDate_mms(date_mms);
        if(final_count!=null)    c.setFinal_count(final_count);
        if(last_mms!=null)    c.setLast_mms(last_mms);
        if(recipient_ids!=null) c.setRecipient(recipient_ids);
        //System.out.println(contact+"     "+date_mms);
        list.add(c);
    }

    /**
     * 
     * @param 根据thread_id 检索sms库, 获得对应的号码
     * @return
     */
    public String[] getPhoneNum(String thread_id)
    {
        String PhoneNum="";
        int noread_mms=0;
        String[] info={"",""};
        String[] projection = new String[]
                { "thread_id", "address", "person", "body", "date", "type","read" };

        Uri uri = Uri.parse("content://sms/");
        ContentResolver cr = getContentResolver();            

        Cursor cursor = cr.query
                (
                        uri, 
                        projection, 
                        "thread_id=?",
                        new String[] { thread_id } ,
                        null
                        );

        while (cursor.moveToNext())
        {
            int phoneNumber = cursor.getColumnIndex("address");
            int isread =cursor.getColumnIndex("read");

            if (cursor.getString(isread).equals("0"))
            {
                noread_mms++;
            }

            PhoneNum=cursor.getString(phoneNumber);    
        }
        info[0]=PhoneNum;
        info[1]=Integer.toString(noread_mms);

        return info;                
    }
} 


你可能感兴趣的:(通讯录,Android通信软件)