android获取短信方法1

adapter.java


package smalt.manger.sms;

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

import smalt.manager.main.SApplication;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;

/**
 * 獲取短信內容
 * 
 * @author Administrator
 * 
 */
public class SmsUtil {
	public static final Uri MMSSMS_FULL_CONVERSATION_URI = Uri
			.parse("content://mms-sms/conversations");

	public static final Uri CONVERSATION_URI = MMSSMS_FULL_CONVERSATION_URI
			.buildUpon().appendQueryParameter("simple", "true").build();
	// 上下文,方便调用
	static public Context mContext;

	/**
	 * 得到分组的短信 里面应该有 联系人名称,短信对话的数量 最近一条短信的内容,最好还能有相关时间 最新一条短信是否已经阅读
	 * 
	 * @return
	 */
	static public List<SmsDataBean> getThreadSmsData() {
		mContext = SApplication.nowSApplication.getApplicationContext();// 得到上下文對象
		Cursor smsThreadCursor = mContext.getContentResolver().query(
				MMSSMS_FULL_CONVERSATION_URI,
				new String[] { "body", "type", "date", "read", "thread_id",
						"address" }, null, null, "date desc");
		// 存入所有會話
		LinkedHashMap<String, SmsDataBean> smsDataMap = new LinkedHashMap<String, SmsDataBean>();
		// 子線程數量
		int threadCount = smsThreadCursor.getCount();
		// 遍歷所有短信
		for (int i = 0; i < threadCount; i++) {
			// 獲取短信
			SmsDataBean nowSmsDataBean = new SmsDataBean();
			// 向下移動一條記錄
			smsThreadCursor.moveToNext();
			nowSmsDataBean.smsBody = smsThreadCursor.getString(smsThreadCursor
					.getColumnIndex("body")); // 內容
			nowSmsDataBean.smsBody = smsThreadCursor.getString(smsThreadCursor
					.getColumnIndex("address")); // 電話號碼
			nowSmsDataBean.smsBody = smsThreadCursor.getString(smsThreadCursor
					.getColumnIndex("thread_id")); // 線程號
			// 設置最新一條短信的時間
			nowSmsDataBean.smsDate = smsThreadCursor.getLong(smsThreadCursor
					.getColumnIndex("date"));
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
			nowSmsDataBean.smsStrDate = sdf.format(new Date(
					nowSmsDataBean.smsDate));
			// 查找有多少條未讀短信
			{
				Uri queryNoReadThreadSmsCountUri = Uri.parse("content://sms/");
				Cursor noReadThreadSmsCountCursor = mContext
						.getContentResolver().query(
								queryNoReadThreadSmsCountUri,
								new String[] { "read", "thread_id" },
								"read = 0 and thread_id ="
										+ nowSmsDataBean.smsThreadId, null,
								null);
				nowSmsDataBean.smsNoReadCount = noReadThreadSmsCountCursor
						.getCount();
				noReadThreadSmsCountCursor.close();
			}
			// 把以上數據加入smsDataList
			smsDataMap.put(nowSmsDataBean.smsThreadId, nowSmsDataBean);
		}// for-end
		smsThreadCursor.close();// 關閉遊標
		Cursor simpleThreadDataCursor = mContext.getContentResolver().query(
				CONVERSATION_URI, new String[] { "_id", "message_count" },
				null, null, "date desc");
		// 循環匹配所有短信會話,設置會話短信數量
		int simpleThreadCount = simpleThreadDataCursor.getCount();
		// 循環將會話數量寫入map
		for (int i = 0; i < simpleThreadCount; i++) {
			simpleThreadDataCursor.moveToNext();
			String simpleId = simpleThreadDataCursor
					.getString(simpleThreadDataCursor.getColumnIndex("_id"));
			SmsDataBean nowSmsDataBean = smsDataMap.get(simpleId);
			if (nowSmsDataBean != null) {
				nowSmsDataBean.smsAllCount = simpleThreadDataCursor
						.getString(simpleThreadDataCursor
								.getColumnIndex("message_count"));
			}
		}// for-end
		simpleThreadDataCursor.close();
		List<SmsDataBean> returnSmsListData = new ArrayList<SmsDataBean>(
				smsDataMap.values());
		return returnSmsListData;
	}

	/**
	 * 取得聯繫人名字
	 * 
	 * @param smsThreadCursor
	 */
	static void testColNameAndDatas(Cursor smsThreadCursor) {
		// 短信會話數量
		int crusorCount = smsThreadCursor.getCount();
		// 短信會話相關數據列
		String[] allColName = smsThreadCursor.getColumnNames();
		for (int i = 0; i < crusorCount; i++) {
			smsThreadCursor.moveToNext();
			for (int j = 0; j < allColName.length; j++) {
				Log.i("smsdata", "列名:" + allColName[j] + "數據:"
						+ smsThreadCursor.getString(j));
			}
			Log.i("smsdata", "`````````````````````");
		}
	}// testColNameAndDatas-end

	/**
	 * 还应该有一个方法 // 能根据指定的ThreadID 取得所有的相关 // 发出和收到的短信
	 * 
	 * @param queryThreadId
	 * @return
	 */
	static public List<SmsDataBean> getSmsDataListByThreadId(
			String queryThreadId) {
		// 得到上下文
		mContext = SApplication.nowSApplication.getApplicationContext();
		// 查找所有的短信
		Uri smsUri = Uri.parse("content://sms/");

		// 按照threadId进行过滤
		Cursor smsDataCursor = mContext.getContentResolver().query(smsUri,
				null, "thread_id = " + queryThreadId, null, "date desc");

		testColNameAndDatas(smsDataCursor);// 測試是否拿到數據
		smsDataCursor.close();
		return null;
	}
}


thread_id字段出現在以下表中:


sms表:存儲短信字段
thread_id是integer類型,表示threads表的id,表示往canonical_addresses表中插入信息
threads表是一組回話,例如號碼為139777777和號碼為135888888的所有短信稱為一組會話,thread_id从1开始,按最早的时间开始排序,最早时间thread_id为1




pdu表:pdu为承载着一条短信的所有短信。
一条短信为140个英文字符长度,在这个长度范围内,即需一个pdu即可。超出这个范围,即要分割成多个pdu数组。


thread_id是integer類型,表示threads表的id




MmsSmsProvider中的mms-sms中有threadID字段,屬於URI_THREAD_ID類型,用於获取指定接收者(附加的查询参数recipient)的会话id,若不存在,新增



activity.java

package smalt.manager.main.demo;

import java.util.List;

import smalt.manager.main.R;
import smalt.manger.sms.SmsAdapter;
import smalt.manger.sms.SmsDataBean;
import smalt.manger.sms.SmsUtil;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

/**
 * 测试类,在这里测试好以后再copy到mainActivity
 * 
 * @author Administrator
 * 
 */
public class DemoDay01Activity extends Activity {
	ListView threadListView;
	List<SmsDataBean> smsThreadListData;
	SmsAdapter mSmsThreadAdapter;

	void initView() {

	}

	void initData() {

	}

	void initListener() {
	}

	public void onCreate(Bundle savedInstanceState) {
		// 测试短信会话的数据
		super.onCreate(savedInstanceState);
		setContentView(R.layout.sms_main);
		SmsUtil.getSmsDataListByThreadId("3");
	
		initView();
		initData();
		initListener();
	}

	public void onResume() {
		super.onResume();
	}
}



你可能感兴趣的:(thread,Date,android,String,null,Integer)