您的位置:首页 > 其它

短信(会话)删除(转)

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

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

下面来看那代码。

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

view plain

ContentResolver cr;

cr = getContentResolver();

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

view plain

String SMS_READ_COLUMN = "read";

String WHERE_CONDITION = SMS_READ_COLUMN + " = 0";

String SORT_ORDER = "date DESC";

int count = 0;

Cursor cursor = cr.query(Uri.parse("content://sms/inbox"),

new String[] { "_id", "thread_id", "address", "person", "date",

"body" }, WHERE_CONDITION, null, SORT_ORDER);

if (cursor != null) {

try {

count = cursor.getCount();

if (count > 0) {

cursor.moveToFirst();

threadId = cursor.getLong(1);

}

} finally {

cursor.close();

}

}

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

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

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

view plain

long id = getThreadId();

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

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

最后删除就可以了。

view plain

cr.delete(mUri, null, null);

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

view plain

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

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

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

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

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

短信信息实时获取

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

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

预览图:



还是来看看代码吧。

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

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

view plain

android.provider.Telephony.SMS_RECEIVED

接着创建onReceive方法。

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

再然后主要代码了。

view plain

@Override

public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(ACTION)) {

StringBuffer SMSAddress = new StringBuffer();

StringBuffer SMSContent = new StringBuffer();

Bundle bundle = intent.getExtras();

if (bundle != null) {

Object[] pdusObjects = (Object[]) bundle.get("pdus");

SmsMessage[] messages = new SmsMessage[pdusObjects.length];

for (int i = 0; i < pdusObjects.length; i++) {

messages[i] = SmsMessage

.createFromPdu((byte[]) pdusObjects[i]);

}

for (SmsMessage message : messages) {

SMSAddress.append(message.getDisplayOriginatingAddress());

SMSContent.append(message.getDisplayMessageBody());

}

}

}

}

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

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

view plain

System.out.println("发送号码:" + SMSAddress + "\n" + "短信内容:"

+ SMSContent);

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

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

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

view plain

<receiver android:name="cn.etzmico.SMSBroadcastReceiver">

<intent-filter>

<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>

</intent-filter>

</receiver>

同时要加上权限。

view plain

<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

static ContentResolver cr;

cr = getContentResolver();

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

view plain

new Timer().schedule(new TimerTask() {

@Override

public void run() {

<span style="white-space:pre"> </span>//删除短信代码

}

}, 5000);

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

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

view plain

StringBuffer SMSAddress.append(message.getDisplayOriginatingAddress()); // 发件人电话号码

StringBuffer SMSContent.append(message.getDisplayMessageBody()); // 短信内容

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

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

view plain

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

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

<uses-permission android:name="android.permission.READ_SMS" />
http://blog.csdn.net/wop_niaoren19870227/article/details/7077765
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: