短信(会话)删除(转)

用过Android系统手机的朋友们相比都知道,AndroidOS的短信和iOS一样,是以会话模式展现的,这种展现方式很容易让使用者查找以前的聊天记录。

关于用代码删除短信,其实删除的也是对话,无论是最近的,还是以前的,统统都会一并删除。

下面来看那代码。

首先需要得到得到短信目录。

view plain

  1. ContentResolver cr;
  2. cr = getContentResolver();

再有就是要遍历下所有短信。

view plain

  1. String SMS_READ_COLUMN = "read";
  2. String WHERE_CONDITION = SMS_READ_COLUMN + " = 0";
  3. String SORT_ORDER = "date DESC";
  4. int count = 0;
  5. Cursor cursor = cr.query(Uri.parse("content://sms/inbox"),
  6. new String[] { "_id", "thread_id", "address", "person", "date",
  7. "body" }, WHERE_CONDITION, null, SORT_ORDER);
  8. if (cursor != null) {
  9. try {
  10. count = cursor.getCount();
  11. if (count > 0) {
  12. cursor.moveToFirst();
  13. threadId = cursor.getLong(1);
  14. }
  15. } finally {
  16. cursor.close();
  17. }
  18. }

"content://sms/inbox"就是短信的所在路径,inbox,收件箱。

上述代码可以得到最新的一条短信。

我们需要调用一下这个方法,我们可以把这个方法。

view plain

  1. long id = getThreadId();
  2. Uri mUri = Uri.parse("content://sms/conversations/" + id);

这样就可以得到最新一跳短信的所对应的id了。

最后删除就可以了。

view plain

  1. cr.delete(mUri, null, null);

别忘了在Manifest.xml中加入权限。

view plain

  1. <uses-permission android:name="android.permission.WRITE_SMS" />
  2. <uses-permission android:name="android.permission.READ_SMS" />

另外要强调的是,如果想要得到最新的收件箱信息,一定要重新获得id;这里的id永远是0,但是如果直接把id用0代替,那么删除的就不是最新的了。

如果想删除其他短信,只需要在遍历的时候加上条件,让返回的id是条件所对应的会话id就可以了,

还有一点要特别强调,这个方法只能删除未读的短信对话,因为他的搜索条件是inbox,当然就是收件箱了;如果读取了短信了,那么Android系统就应该认定该信息不属于收件箱了。

短信信息实时获取

我们知道,只需通过代码就可以读到收件箱中的短信,发件箱中的短信;但是却没办法在短信发来的瞬间获取;如果我们在短信发来的一瞬间能得到相应的信息内容,那么我们就可以依次来展开很多应用了——也就是通过短信去远程操作一部手机。

如果想实时获取,就需要调用receiver了,写一个监听类,这样我们就可以实时获取短息信息了。

预览图:

还是来看看代码吧。

首先,我们需要创建一个监听类SMSBroadcastReceiver,让他去继承BroadcastReceiver。

再来初始化一个常量ACTION,并赋短信相关参数值。

view plain

  1. android.provider.Telephony.SMS_RECEIVED

接着创建onReceive方法。

然后用getAction去监听手机短信相关动态,利用StringBuffer来保存短信信息。

再然后主要代码了。

view plain

  1. @Override
  2. public void onReceive(Context context, Intent intent) {
  3. if (intent.getAction().equals(ACTION)) {
  4. StringBuffer SMSAddress = new StringBuffer();
  5. StringBuffer SMSContent = new StringBuffer();
  6. Bundle bundle = intent.getExtras();
  7. if (bundle != null) {
  8. Object[] pdusObjects = (Object[]) bundle.get("pdus");
  9. SmsMessage[] messages = new SmsMessage[pdusObjects.length];
  10. for (int i = 0; i < pdusObjects.length; i++) {
  11. messages[i] = SmsMessage
  12. .createFromPdu((byte[]) pdusObjects[i]);
  13. }
  14. for (SmsMessage message : messages) {
  15. SMSAddress.append(message.getDisplayOriginatingAddress());
  16. SMSContent.append(message.getDisplayMessageBody());
  17. }
  18. }
  19. }
  20. }

代码中的SMSAddress为发送短信的号码,SMSContent为短信内容。

要想看到是否成功获取,最简单的方法就是把这两个参数打印出来。

view plain

  1. System.out.println("发送号码:" + SMSAddress + "\n" + "短信内容:"
  2. + SMSContent);

不过要把他们加入for循环中,因为当新信息发来时,SMSAddress和SMSContent将被替换。

因此如果要是做应用时,也是在for循环中判断的。

最后要记得在Manifest.xml中注册监听器。

view plain

  1. <receiver android:name="cn.etzmico.SMSBroadcastReceiver">
  2. <intent-filter>
  3. <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
  4. </intent-filter>
  5. </receiver>

同时要加上权限。

view plain

  1. <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

这样,我们运行程序后,只要有短信接收,SMSAddress和SMSContent就会被赋值。

这里顺便补充一个知识点,关于Eclipse程序的。

相信很多初学者不知道,Eclipse自带一个发短信插件,可以实现给虚拟机发送短信。这样,我们在做短信应用的时候,就不用同时启动多台虚拟机了……

如何操作呢?方法如下。

1.点击菜单栏中的 Window 窗口。

2.找到哦啊其中的 Show View 目录。

3. 选择 Other...。

然后我们发现会弹出一个窗口。

4,为了便于操作,我们在弹出的窗口的搜索栏中,直接输入 Emulator Control。

5.点击列表中的 Emulator Control,再点OK;或者直接双击。

这样就出现了一个窗口,其中有很多参数。

其他的以后有机会再做介绍,我们这次至用到其中4个。

如图所示,我们只需要输入对应的参数,选择需要的类型,最后点发送就可以了。

PS:有的人奇怪为什么灰色,没法输入,没法选择,那是因为你没有选中模拟器。这个插件只能同时给一个模拟器发送消息。关于模拟器的选择,和调用Emulator Control的方法差不多,区别只是在输入Emulator Control的时候输入 Devices 就可以了。你当前选中哪个模拟器了,就会给哪个模拟器发送消息,不需要输入模拟器号码。

短信实时删除

首先,在Activity类中声明 ContentResolver,且在onCreate中定义。

view plain

  1. static ContentResolver cr;
  2. cr = getContentResolver();

其次,Android的短息接收机制中,是先监听到,然后存入收件箱以及在Notification中提示,系统监听到短信后不会立刻存入收件箱和提示,因此在删除时要特别注意。

view plain

  1. new Timer().schedule(new TimerTask() {
  2. @Override
  3. public void run() {
  4. <span style="white-space:pre">                            </span>//删除短信代码
  5. }
  6. }, 5000);

我们可以做一个这样的延时器,因为接收短信触发短信接收类中 onReceive 方法时,收件箱里并没有信息呢,即使把优先级降到最低也无济于事。
因此我们把删除短信的方法做一个延时操作就可以了,根据本人测试,5秒为妙,因为很多机器会因为各种原因而早成系统运行慢……如果再长,机器更卡,那就再把事件增加一些就可以了……这里的5000为5000毫秒,即5秒。

还有,我们为了避免短信删除,我们可以做if判断,给删除短信方法添加条件。

view plain

  1. StringBuffer SMSAddress.append(message.getDisplayOriginatingAddress()); // 发件人电话号码
  2. StringBuffer SMSContent.append(message.getDisplayMessageBody()); // 短信内容

这样,就不会造成短信的误删了。

最后再提示下Manifest.xml中的权限问题,一共3个。

view plain

    1. <uses-permission android:name="android.permission.RECEIVE_SMS" />
    2. <uses-permission android:name="android.permission.WRITE_SMS" />
    3. <uses-permission android:name="android.permission.READ_SMS" />

http://blog.csdn.net/wop_niaoren19870227/article/details/7077765

时间: 2024-10-10 02:35:29

短信(会话)删除(转)的相关文章

(转)[Android实例] 关于使用ContentObserver监听不到删除短信会话的解决方案

最近做通讯录的项目,需要实时监听短信的删除,就用到了观察者ContentObserver,怪异的事情就此发生,当我删除一条短信的时候,可以监听到,但是,当我删除整条短信的时候,就无法监听到,查了很多资料,都没有一个好的解决方案,顺便吐糟一下:大家来eoe发问题,问题解决了,也不说把解决的方法给大家分享一下... OK,先看源码吧com.android.providers.telephony.MmsSmsProvider这个类的删除操作源码 @Override    public int dele

android 添加手机短信,获取手机短信,删除手机短信和修改手机短信

注意添加权限: <uses-permission android:name="android.permission.READ_SMS"></uses-permission> <uses-permission android:name="android.permission.WRITE_SMS"></uses-permission> 代码如下: //更新短信 private void UpdateSMS() { /* u

苹果手机的SB系列(8)为什么没有短信全部删除?

为什么没有全部删除短信,网上还有提供改时间后,自动清空? 我要是有500条短信,一小部分短信不能删除怎么办? 全选,反选程序设计最常见的功能教没有? 原文地址:https://www.cnblogs.com/rovedog/p/12388282.html

监听短信增删以及短信会话增删

网上找了许久,才找到会话增删监听的uri与短信不一样,如下: resolver.registerContentObserver(Uri.parse("content://sms"), true, observer); resolver.registerContentObserver(Uri.parse("content://mms-sms"), true, observer);

怎样恢复手机删除的短信内容

手机短信删除了怎么恢复?怎么最简单的恢复手机短信?误删的短信应该如何找回?最简单的找回方法这里来教你.不知道大家有没有在各种垃圾短信的删除时候,出现将重要的短信误删的情况.对于迷糊的小编就会经常的遇到这种情况.重要的短信误删了,真的会很麻烦,没有对应的短信一些操作就会无法进行.那么应该怎么办才能将误删的短信找回了,今天小编就和大家分享一种在手机上就可进行短信找回的方法,下面一起看一看吧.具体的操作步骤如下:第一步:在手机的软件管理市场,搜索并下载"极速数据恢复"软件,这款工具可以恢复手

手机删除短信如何恢复?不知道的话,赶紧来收藏

手机删除短信算是生活中比较常见的事,但是有的时候呢,或许因为自己的一个不小心就可能导致我们的手机短信出现被我们误删的现象,那么若是误删之后想要找回呢?下面不妨我们就一起看看如何恢复我们手机删除的短信吧! 首先我们的手机短信被删除之后,我们也不用紧张,我们可以选择使用我们的手机备份去找回我们的手机短信,这里我们可以选择使用我们的手机备份与还原去找回我们的短信: 当然了,我们也可以使用我们的百度网盘去找回我们的手机短信,我们只需要找到我们的百度网盘,点击更多,然后便可以找回我们的手机短信了(这里用的

手机短信删除了怎么恢复?两个快速恢复的简单技巧

手机短信删除了怎么恢复?你是不是有过这样的困惑,当你遇到自己的手机短信被删除之后,你是怎么样找回的呢?当然了,我们想要找回的手机短信对我们来说都是比较重要的,但是就是这些重要的短信,我们有的时候就很有可能被自己删除了. 那么删除了我们的短信之后,我们该怎么恢复呢?我们是不是可以通过一些方法去找回我们的手机短信呢?其实是完全可以的,下面我们就一起看看具体的恢复方法吧. 其实很多的时候,我们都是会对我们的手机进行备份的,就像我们是华为手机一样,我们可以选择在"设置"界面中点击"用

Android开发删除短信

本人一直有一个需求,想要手机自动拦截黑名单里联系人的信息并自动删除这些短信,手机管家之类的软件可以拦截但是没找到能删除这些短信的,于是就萌生了想自己写一个android软件的想法. 加上物联网的兴起,安卓设备开发肯定前景很好. 随后又得知 安卓开发可以用java语言,就用eclipse,呵呵,本人还是有些java基础的,于是乎,本人就开始扑腾了. 把eclipse sdk adt搭建好之后,本人就开始了开发这款自动拦截并删除黑名单短信的软件.都已经实现. 在编写过程中,删除短信的模块倒是坑了我挺

苹果Iphone手机通讯录、短信、微信、QQ聊天记录删除数据恢复+q:2100997525

百度官网认证QQ[百度唯一认证QQ:2100997525]专业破解苹果ID ,手机微信,手机号码监听,破译陌陌,QQ, 短信内容查询删除 开房登记记录 通话清单  QQ聊天记录查询删除 密码破解 邮箱以及各种聊天记录恢复与删除查询[百 度唯一认证QQ:2100997525]专业手机定位,通话清单,知己知彼,百战百胜,网站入侵等其他业务 ▌是您值得信赖的 怎么偷看別人的QQ聊天記錄?[百度唯一認証QQ:2100997525]專業破解苹果id.手机微信,破譯陌陌,QQ,郵箱以及各 種聊天記錄恢復與查