钱柜娱乐开户短信和彩信探秘threads

原创 2011年08月12日 19:35:57


钱柜娱乐开户源代码在  彩信sms 表和彩信 pdu表,增加了一个触发器

CREATE TRIGGER delete_obsolete_threads_pdu AFTER 
DELETE ON pdu BEGIN   
DELETE FROM threads   
WHERE     _id = old.thread_id     AND _id NOT IN    
 (SELECT thread_id FROM sms      UNION SELECT thread_id from pdu);
 END

仔细看下就明白,如果threads表没有sms和pdu外部引用的时候,这条thread就会被删除。


thread被删除后,你再插入一条短信或者彩信(当然是代码插入),这时候因为没有thread id,所以就会不显示。


有人可能想到对threads表一起进行维护不就行了吗?  很不幸 ,系统对这个表的providers并不完全开放,只能用于查找。


但我们这时候又需要thread_id,   我对源代码进行了一些修改,把thread类提取了出来,仅供大家参考


package com.sweetop.provider;

import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import 钱柜娱乐开户.content.Context;
import 钱柜娱乐开户.database.Cursor;
import 钱柜娱乐开户.net.Uri;
import 钱柜娱乐开户.text.TextUtils;
import 钱柜娱乐开户.util.Log;
import 钱柜娱乐开户.util.Patterns;

public final class Threads implements ThreadsColumns {
	private static final String[] ID_PROJECTION = { BaseColumns._ID };
	private static final String STANDARD_ENCODING = "UTF-8";
	private static final Uri THREAD_ID_CONTENT_URI = Uri
			.parse("content://mms-sms/threadID");
	public static final Uri CONTENT_URI = Uri.withAppendedPath(
			Uri.parse("content://mms-sms/"), "conversations");
	public static final Uri OBSOLETE_THREADS_URI = Uri.withAppendedPath(
			CONTENT_URI, "obsolete");
	public static final Pattern NAME_ADDR_EMAIL_PATTERN = Pattern
			.compile("\\s*(\"[^\"]*\"|[^<>\"]+)\\s*<([^<>]+)>\\s*");

	public static final int COMMON_THREAD = 0;
	public static final int BROADCAST_THREAD = 1;

	// No one should construct an instance of this class.
	private Threads() {
	}

	/**
	 * This is a single-recipient version of getOrCreateThreadId. It's
	 * convenient for use with SMS messages.
	 */
	public static long getOrCreateThreadId(Context context, String recipient) {
		Set<String> recipients = new HashSet<String>();

		recipients.add(recipient);
		return getOrCreateThreadId(context, recipients);
	}

	/**
	 * Given the recipients list and subject of an unsaved message, return its
	 * thread ID. If the message starts a new thread, allocate a new thread ID.
	 * Otherwise, use the appropriate existing thread ID.
	 * 
	 * Find the thread ID of the same set of recipients (in any order, without
	 * any additions). If one is found, return it. Otherwise, return a unique
	 * thread ID.
	 */
	public static long getOrCreateThreadId(Context context,
			Set<String> recipients) {
		Uri.Builder uriBuilder = THREAD_ID_CONTENT_URI.buildUpon();

		for (String recipient : recipients) {
			if (isEmailAddress(recipient)) {
				recipient = extractAddrSpec(recipient);
			}

			uriBuilder.appendQueryParameter("recipient", recipient);
		}

		Uri uri = uriBuilder.build();
		// if (DEBUG) Log.v(TAG, "getOrCreateThreadId uri: " + uri);

		Cursor cursor = context.getContentResolver().query(uri, ID_PROJECTION,
				null, null, null);
		if (true) {
			Log.v("Threads",
					"getOrCreateThreadId cursor cnt: " + cursor.getCount());
		}
		if (cursor != null) {
			try {
				if (cursor.moveToFirst()) {
					return cursor.getLong(0);
				} else {
					Log.e("Threads", "getOrCreateThreadId returned no rows!");
				}
			} finally {
				cursor.close();
			}
		}

		Log.e("Threads",
				"getOrCreateThreadId failed with uri " + uri.toString());
		throw new IllegalArgumentException(
				"Unable to find or allocate a thread ID.");
	}

	public static String extractAddrSpec(String address) {
		Matcher match = NAME_ADDR_EMAIL_PATTERN.matcher(address);

		if (match.matches()) {
			return match.group(2);
		}
		return address;
	}

	/**
	 * Returns true if the address is an email address
	 * 
	 * @param address
	 *            the input address to be tested
	 * @return true if address is an email address
	 */
	public static boolean isEmailAddress(String address) {
		if (TextUtils.isEmpty(address)) {
			return false;
		}

		String s = extractAddrSpec(address);
		Matcher match = Patterns.EMAIL_ADDRESS.matcher(s);
		return match.matches();
	}
}

当你需要获得一个thread id时,仅需调用

Threads.getOrCreateThreadId(this, address)


address是发送方的手机地址


如有问题,可以再评论中说明,我会一一回复。


另,转载注明出处


如果我的文章对您有帮助,请用支付宝打赏:



版权声明:本文为博主原创文章,未经博主允许不得转载。

钱柜娱乐开户短信源码部分解析(双卡)

点击新建短信之后 @Override protected void onCreate(Bundle savedInstanceState) { mIsSmsEnabled ...
  • xunfan
  • xunfan
  • 2014年09月15日 10:29
  • 1515

CreateThread使用(六个参数介绍)

function CreateThread(   lpThreadAttributes: Pointer;           {安全设置}   dwStackSize: DWORD;      ...
  • sforiz
  • sforiz
  • 2012年07月02日 22:36
  • 30641

钱柜娱乐开户短彩信源码解析-短信发送流程(一)

有人问我怎么了解原生应用的流程,可能每个人有最适合每个人的方法,现将我的方法说一下,供大家参考: 1、通过DEBUG,DEBUG可以了解每一步代码做了什么,而且可以看到堆栈执行过程。 2、通过打Log...
  • hailushijie
  • hailushijie
  • 2013年08月22日 21:27
  • 6034

短信和会话界面的数据库实现(sms and threads)

目标:实现短信(或者类似微信、QQ之类的聊天工具)的会话界面(threads,左图)和短信界面(sms,右图)的数据库搭建。 图1 左为threads界面,右为sms界面    两...
  • BrilliantEagle
  • BrilliantEagle
  • 2014年08月12日 15:19
  • 3230

钱柜娱乐开户短信Mms接受流程

短信的接收流程应用层 1、源文件 这部分代码在packages/apps/Mms下,涉及的主要类: [plain] view plain copy com.钱柜娱乐开户....
  • wds1181977
  • wds1181977
  • 2016年07月07日 16:56
  • 1377

钱柜娱乐开户 短信模块分析(五) MMS之彩信的发送与接收

1.4.2彩信发送   彩信比短信麻烦很多。从sendMmsWorker函数的参数就可以看出来:(conv, mmsUri, persister, slideshow, sendReq) 上下文,ur...
  • t12x3456
  • t12x3456
  • 2013年07月18日 09:25
  • 8692

钱柜娱乐开户 发送彩信和短信

  • 2012年08月14日 20:41
  • 64KB
  • 下载

用Intent发短信和彩信

用Intent发短信,主要代码如下: String telStr = "18253100000"; // 接收人电话 String note = ...
  • l1976135784
  • l1976135784
  • 2014年04月08日 22:57
  • 1274

短信和会话界面的数据库实现(sms and threads)

目标:实现短信(或者类似微信、QQ之类的聊天工具)的会话界面(threads,左图)和短信界面(sms,右图)的数据库搭建。 图1 左为threads界面,右为sms界面    两...
  • BrilliantEagle
  • BrilliantEagle
  • 2014年08月12日 15:19
  • 3230

钱柜娱乐开户 4.4+ 拦截短信和发送短信

  • 2016年06月28日 15:00
  • 1.2MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:钱柜娱乐开户短信和彩信探秘threads
举报原因:
原因补充:

(最多只允许输入30个字)