android短信和彩信探秘threads
Posted 吴冬冬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android短信和彩信探秘threads相关的知识,希望对你有一定的参考价值。
android源代码在 彩信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 android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import android.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是发送方的手机地址
如有问题,可以再评论中说明,我会一一回复。
另,转载注明出处
以上是关于android短信和彩信探秘threads的主要内容,如果未能解决你的问题,请参考以下文章
手机端ios和android浏览器 如何实现mms广播电台在线音频播放?
Android App实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)