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相关推荐
- Android短信开发 发送彩信 ‘ 高通源码 ‘ (彩信发送过程1)
Android彩信发送有下面几个类: 一个一个类看 : 1 . ComposeMessageActivity.java 详情页面 2 . WoringMessage.java ...
- android 读取短信 彩信,Android 短信转换成彩信的消息数量(实例代码)
默认3条以上转为彩信 改为5条 路径vendor/mediatek/proprietary/packages/apps/Mms/src/com/android/mms/MmsConfig.java p ...
- Android短信数据库相关
系统的短信库存在data/data/com.android.providers.telephony/databases/mmssms.db 打开mmssms.db 再打开sms表 因为所有短信数据都储 ...
- Android短信发送流程之多收件人发送(原)
前面的< Android短信发送流程之长短信发送 >中介绍了长短信对于普通短信的区别,而对于多收件人的情况,在SmsMessageSender的queueMessage()方法中我们了解到 ...
- android 短信ril移植,将Android平台的RIL层移植到基于LINUX的通用平台的研究与实现...
摘要:本文通过对Android RIL层代码分析,将android RIL层功能在纯LINUX平台上实现,完全脱离了Android系统.为基于LINUX的通用平台实现一套成熟的RIL层代码,并开发出相 ...
- 安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。
全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓短信功能全解:调用系统短信功能发送短信.彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信. 首先需要 ...
- Android短信数据库简析
如果想跳过数据库介绍,直接看数据库操作代码的话,请点击这里: 读取Android短信 -------------– Android短信数据库: 读取Android系统所有短信 读取Android短信会 ...
- Android短信的发送和广播接收者实现短信的监听
Android短信的发送和广播接收者实现短信的监听 要注意Android清单中权限的设置以及广播的注册监听实现 以下就是 Android清单的XML AndroidManifest.xml < ...
- android短信功能裁剪,Android短信发送功能实现技巧分享
如现在启动一模拟器id 号为5554,运行cmd telnet localhost 5554 输入help 可以看到很多用于模拟器中的功能命令 gsm call 134343434 // 便是呼叫 ...
最新文章
- Resin3.19 连接池配置
- 【转】如何将域中的AD数据导入SharePoint
- rsync同步工具学习笔记
- strongswan 配置文件 /etc/ipsec.conf 速查手册1
- android——数据库版本升/降级问题
- android am start activity,adb shell am start -n package/.XXXactivity命令学习汇总
- 如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路
- ADS中功放的PAE计算总结
- asdfasdfasdf
- NSIS “Win32 Error,Code:740 ,请求的操作需要提升”错误解决方法
- 微信支付v3——批量转账到零钱(提现)
- 好家园房产中介网后台管理项目
- SQL语句group by 的求和sum
- jacobi方法 matlab,Jacobi(雅可比)迭代原理与matlab代码
- 不使用前端的pdf.js,通过pdfbox转换pdf为图片,拼接成html实现pdf前端预览
- 机器视觉——VisionPro应用开发指南
- grant with admin option and grant with grant option
- Android中集成支付宝
- Google Glass: 未来不遥远
- turtle库描绘彩虹旋转图
热门文章
- 学习Python处理Excel 难度1级别 多表合并、数据透视表、拆分合并单元格并获得一维表
- ubuntu 12.04 下如何修改屏幕分辨率
- 聊一下Node.js中NAPI的napi_value
- 2021最新最全前端面试题(包含HTML、CSS、JavaScript、Vue、React、浏览器、算法与数据结构等)
- NDCG介绍、实现及在推荐系统中的应用实践
- sql注入bypass方法
- Orin 调试GMSL camera遇到问题之MIPI CSI2 报文解析
- 数据中心中出现极性问题怎么办?
- 光学分频器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 虚拟机给openwrt添加硬盘并且配置smb