短信(会话)删除(转)

用过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" />  
    4.  

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

 

时间: 2024-08-31 17:54:19

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

实例详解Android 获取短信会话列表

Android中的短信并没有正式的content provider可用,在官方文档中没有提供定义.不过依然可以自己定义好URI,然后查询出短信内容.例如conetent://sms则是所有短信所在的path. 要将短信按会话分类,原先我是查询出所有短信后,然后再按照thread_id分类.系统自带的短信程序包含一个会话显示界面,每个条目包含:联系人.短信数量.第一条短信等内容.当我的程序处理的短信较多时,一次查询出所有的短信就变得很慢.(如果再加上为每个会话查询联系人信息,则会更慢) 看了系统短

苹果ios7(iphone5s/5c)删除短信/批量删除短信

删除一个号码的所有短信 1.进入手机"信息" 2.这样我们可查看单号码的所有短信,上下移动查看所有短信记录. 3.如果要删除我们回到短信列表页面,然后用手指向左移动,出现"删除"选项即可,如图所示 单独删除一条短信 1.同样打开我们要删除的短信, 2.然后在短信查看中我们长按要删除的短信内容不动,随后会在短信内容上方显示功能菜单,点击"更多"选项继续,如图所示 3.如图我们点击"删除" 4.然后再点击"删除信息&qu

升级了ios7的iphone如何删除短信(iphone5s/5c)

  升级了ios7的iphone5应该如何删除短信            对于iphone5的短信删除功能,很多人都没能全面的了解,对于一些比较陈旧的短信一般采用逐条删除的方式.但是在升级完ios7之后,大家会发现,原来向右滑动删除短信的方法竟然不好使了,这其中的原因自然是短信的删除方式做了改变.            Iphone5的短信分为单个短信和会话短信两种模式,单个短信自不必说,这个概念就是我们平时偶尔收到条短信通知之类的内容:会话短信是和某个联系人或固定对象短信交流时,所形成的多个短

android 删除已发送的短信

问题描述 android 删除已发送的短信 android中,我要实现短信的删除,是已发送的短信.请问需要这么实现.如:sendTextMessage(), 发送完后,打开短信不让用户看到刚发送的短信 解决方案 自己顶!d=====( ̄▽ ̄*)b贴 解决方案二: 1.调用短信的数据库 2.删除发送的短信 解决方案三: 今天可以买到回家的车票了.很是高兴,出来又TMD的半年了.钱也没赚到.但还是想回去.好了就说这么多吧. 今天把昨天的博客补一下,写了一个短信发送的东西,做个笔记,以后拿出来好看,不

Android项目实现短信的发送、接收和对短信进行拦截_Android

说实话,关于Android中对短信的一些相关操作是一个比较入门的东西.那我现在还要来写这一篇博客的原因只是因为现在开发中有相关内容,而又想将这些东西分享给更多的人来学习,同时在以后对Android系统的短信进行其他学习的时候也就放在这里做一个记录了,于是就写了这篇啰嗦的文章.如果你觉得这是一个不错的东西,欢迎收藏,以便在以后更方便地查看本人在此篇文章中更新的内容.下面我就从标题中的三个方面来对Android系统中的短信操作进行一个简单地学习. 短信的发送 由于Android中对短信发送方法的优良

CAMD短信猫返回ERROR

问题描述 最近用C#写了一个小程序通过CDMA短信猫发送短信.之前测试一直没有问题,只从我给短信猫中的卡回了几次短信,给短信猫中的卡打过几次电话之后的今天.每次发送短信都返回一下内容.AT+WSCL=6,4ERRORAT+CMGF=1ERRORAT+CMGS="13511956290",154ERROR短信发送不成功.本人只是个二次开发.编程能力很菜.大神勿喷大家帮忙看看. 解决方案 解决方案二:ERRORAT+CMGF=1ERRORAT+CMGS="13511956290&

iPhone4再出漏洞:短信删不掉

已删除的信息依然能靠"搜索"功能"复活" 苹果:可带机器去旗舰店检测 本报讯(记者 冯祎)明明已被删除的短信,通过手机特有的搜索功能还能"复活",近日,经历了"信号门"风波后,正在热卖的iPhone4又被用户们揪出了一大漏洞. 昨天,记者在"WeiPhone.com"等论坛上看到,不少 网友发帖称发现了iPhone4的又一大"Bug"--短信删不掉. "我在短信界面已经把短信删

Android项目实现短信的发送、接收和对短信进行拦截

说实话,关于Android中对短信的一些相关操作是一个比较入门的东西.那我现在还要来写这一篇博客的原因只是因为现在开发中有相关内容,而又想将这些东西分享给更多的人来学习,同时在以后对Android系统的短信进行其他学习的时候也就放在这里做一个记录了,于是就写了这篇啰嗦的文章.如果你觉得这是一个不错的东西,欢迎收藏,以便在以后更方便地查看本人在此篇文章中更新的内容.下面我就从标题中的三个方面来对Android系统中的短信操作进行一个简单地学习. 短信的发送 由于Android中对短信发送方法的优良

三星手机S5短信记录在哪删除?S5删除短信方法

1.三星安卓系统手机万事都在桌面右下角的[应用程序]图标开始,我们点击它如下图红框处.   2.然后在应用程序界面点击如下图红框的[记录]图标,然后进入.   3.进入到短信管理界面我们按一下手机上的[菜单]然后在弹出层界面点击[查看]菜单,具体如下图所示.   4.然后在这里我们就可以选择查看短信的方式了,在此我选择[全部信息]如图所示.   5.选择全部信息之后我们再按手机下方的[菜单]然后在弹出界面我们选择[删除]按钮,细节如下图所示.     6.勾好了在下面我们就可以选择要删除的记录了