Android的基本常用的短信操作
1、调用系统发送短信界面(传入手机号码+短信内容)
2、隐藏发送短信(指定号码指定内容)(这里隐藏只是没有反写入数据库)
3、获得收件箱接收到的短信
4、Android屏蔽新短信通知提示信息:(ContentObserver)
4、删除刚接收到的短信:
A)、带提示删除
B)、无新短信通知=删除短信
所用到的相关数据类:
Intent、SmsManager、BroadcastReceiver、ContentObserver、Bundle
涉及动作(Action):
android.provider.Telephony.SMS_RECEIVED
涉及权限:
<!-- 短信 -->
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SMS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
1、调用系统发送短信界面(传入手机号码+短信内容)
(直接使用Intent 意图执行系统的sms即可--同理这里可以使用该方式调用手机发送邮件等)源码如下:
public void SendSMS( String aContent ){
// 新建smsto意图
Intent iIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:158********"));//传入要发送的地址
// 设置短信内容
iIntent.putExtra("sms_body", aContent);//设置传递的信息内容
// 启动短信服务内容
aContent.startActivity(iIntent);//直接打开意图即可
}
2、隐藏发送短信(指定号码指定内容)(这里隐藏只是没有反写入数据库)
创建发送自己的短信需要用到短信管理类SmsManager,使用它的sendTextMessage方法即可实现程序发送:
public void SendSMSHide(String aPhoneNUM, String aContent){
// 创建一个默认的SmsManager。
SmsManager aSmsManager = SmsManager.getDefault();
// 发送信息的intent参数。
String aSent = "SMS_SENT";
// 信息反馈的intent参数。
String aDelivered = "SMS_DELIVERED";
// 创建发送新信息的PendingIntent对象
PendingIntent aSentPI = PendingIntent.getBroadcast(this, 0, new Intent(aSent), 0);
// 信息反馈的PendingIntent。
PendingIntent aDeliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(aDelivered), 0);
aSmsManager .sendTextMessage(aPhoneNUM, null, aContent, aSentPI, aDeliveredPI);//发送短信(还可以发送彩信等)
//debuge
if(BOOL_ISDEBUGE){
Toast.makeText(aContent,"短信送出成功!!",Toast.LENGTH_SHORT ).show();
}
}
3、获得收件箱接收到的短信
A)、方法一:
通过继承BroadcastReceiver服务,处理onReceive函数,判断接收到的动作为SMS_RECEIVED
我将其封装在ReceiveSMS(aContext, aIntent);函数中只需要在onReceive()函数中调用即可!
public void ReceiveSMS(Context aContext, Intent aIntent) {
if (aIntent.getAction().equals(SSTR_SMSACTION)) { // 监听SMS_RECEIVED消息
Bundle iBundle = aIntent.getExtras(); // 获取Intent数据
if (iBundle != null) {
Object[] iObject = (Object[]) iBundle.get("pdus"); // 获取pdus对象
SmsMessage iMsg = SmsMessage.createFromPdu((byte[]) iObject[0]); // 初始化信息对象
m_strSMSAddress = iMsg.getDisplayOriginatingAddress(); // 获取信息发送人
m_strSMSText = iMsg.getDisplayMessageBody(); // 获取信息内容
//to do your things
Toast.makeText(aContext, "Address = "+m_strSMSAddress+"\nCountent = "+m_strSMSText, Toast.LENGTH_LONG).show();
}
}
}
B)、方法二:继承ContentObserver类在onChange中调用(注册监听sms即可)
this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content);
4、Android屏蔽新短信通知提示信息:(ContentObserver)
大致思路先从收件箱获得指定未读短信,在执行通知前更改为已读,执行SQL的updata即可
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//读取收件箱中指定号码的短信
cursor = managedQuery(Uri.parse("content://sms/inbox"),
new String[]{"_id", "address", "read"},
"read = 0", null,
"date desc");
cursor.moveToFirst();
for(int i =0;i<cursor.getCount();++i)
{
Log.i("address","address = "+cursor.getLong(1));
if(cursor.getString(1).indexOf("136******")>=0)
{//这里运用indexof方式查找,并没有用比较因为系统会有国际号码
ContentValues values = new ContentValues();
values.put("read", "1"); //修改短信为已读模式
getContentResolver().update(Uri.parse("content://sms/inbox"), values, "
_id=?", new String[]{""+cursor.getInt(0)});
break;//这里如果跳出就只能更改一条(刚收到的可以这样实现而且手机上方将不再有短信提示)
}
cursor.moveToNext();
}
}
5、删除刚接收到的短信:
A)、带提示删除(这样不知到有什么用。呵呵。写出来分享)
短信能删除但是当手机接收到短信时还会在手机通知里面显示给用户
继承BroadcastReceiver类,首先获得会话id在执行数据库删除即可
I、获得会话id:
(思路这样还可以简洁的-网上找的大家也可以用上面的managedQuery方法)
private long getThreadId(Context aContext) {
long threadId = 0;
String SMS_READ_COLUMN = "read";
String WHERE_CONDITION = SMS_READ_COLUMN + " = 0";
String SORT_ORDER = "date DESC";
int count = 0;
Cursor cursor = aContext.getContentResolver().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();}}
Log.i("threadId", String.valueOf(threadId));
return threadId;}
II、执行删除:
这里我们可以在BroadcastReceiver的onReceive函数里面直接调用删除方法如下:
long id = getThreadId(aContext);
Uri mUri=Uri.parse("content://sms/conversations/" + id);
//无条件删除id所有会话,第二个参数可以添加条件
aContext.getContentResolver().delete(mUri, null, null);
但
是这里你会发现你删除的并不是你刚才发送的信息,而是你上一次发送的信息的所有,这里是为什么呢,原因是我们刚刚监听的收件箱的时候当前会话是还没有来得
及创建的,所以删除会话也是删除的以前的,所以这里我们需要时间。可以用如下方式来实现:这样就会成功了。但是这种方式短信通知依然存在
new Thread(){
public void run(){
try {sleep(600);//等待一段时间删除
} catch (InterruptedException e) {
e.printStackTrace();}
long id = getThreadId(aContext);
Uri mUri=Uri.parse("content://sms/conversations/" + id);
aContext.getContentResolver().delete(mUri, null, null);
}}.start();
Android的基本常用的短信操作的更多相关文章
- 【Android】Android解析短信操作
目录结构: contents structure [-] 获取短信 发送短信 1.获取短信 在AndroidManifest.xml中,添加权限: <uses-permission androi ...
- Android手机上监听短信的两种方式
Android手机上监听短信有两种方式: 1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. AndroidManifest.xml: ...
- 利用Android Lost通过互联网或短信远程控制安卓设备
利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...
- Android安卓电话拦截及短信过滤
package com.focus.manager; import java.lang.reflect.Method; import Android .app.Activity; import And ...
- 【Android学习】调用系统短信、电话
今天全心投入Android学习已经有一段时间了,从起初的啥也不懂,到现在半知半解状态,随笔记录些简单且常用的系统功能代码. 调用Android系统短信,其实调用短信非常简单,一个方法就可以搞定.我们可 ...
- [android]ShareSDK——内容分享和短信验证
前言 新版本号ShareSDK的分享和短信验证,按官网的文档,都须要加入一个<Activity></Activity>标签,而分享和短息验证的这个标签内容都一样.会冲突. 解决 ...
- android 中调用接口发送短信
android中可以通过两种方式发送短信 第一:调用系统短信接口直接发送短信:主要代码如下: //直接调用短信接口发短信 SmsManager smsManager = SmsManager.getD ...
- Android Tips: 打电话和发短信
利用Android打电话非常简单,直接调用Android内在的电话功能就可以了. btnDail.setOnClickListener(new OnClickListener(){ @Override ...
- Android 利用内容观察者实现短信窃听
<Android 内容观察者的原理>中介绍了内容观察者的一些基本原理,并做了简单的实战,本文接着进一步做一个小项目实战 package com.wuyudong.smslistener; ...
随机推荐
- 20165203《Java程序设计》第八周学习总结
20165203<Java程序设计>第八周学习总结 教材学习内容总结 第12章 进程与线程 进程的完成过程:代码加载.执行至执行完毕 线程:一个进程由多个线程组成. 线程的完成过程:自身的 ...
- HTML标签列表总览
超文本标记语言(简称:HTML)标记标签通常被称为HTML标签,HTML标签是HTML语言中最基本的单位,HTML标签是HTML(标准通用标记语言下的一个应用)最重要的组成部分.HTML标签的大小写无 ...
- Metronic 5.0.5 bootstrap后台管理模板
演示地址:http://keenthemes.com/preview/metronic/ 下载 Dashboard Table
- #JS Ajax的error函数
使用jquery的ajax方法向服务器发送请求的时候,常常需要使用到error函数进行错误信息的处理, 一般error函数返回的参数有三个: function(jqXHR jqXHR, String ...
- win7下docker环境搭建nginx+php-fpm+easyswoole+lavarel+mysql开发环境
win7环境基础在上一篇win7下docker环境搭建nginx+php-fpm+easyswoole开发环境中已经详细叙述搭建完成 本篇文章将叙述如何在上述基础上搭建laravel开发环境,这个其实 ...
- JMeter导入jmx运行脚本时出现这样的错误jmeter.save.SaveService: Conversion error com.thoughtworks.xstream.converters.ConversionException:
2016/12/20 13:51:55 ERROR - jmeter.save.SaveService: Conversion error com.thoughtworks.xstream.conve ...
- Jenkins的Pipeline脚本在美团餐饮SaaS中的实践
一.背景 在日常开发中,我们经常会有发布需求,而且还会遇到各种环境,比如:线上环境(Online),模拟环境(Staging),开发环境(Dev)等.最简单的就是手动构建.上传服务器,但这种方式太过于 ...
- 02-c#基础之01-基础语法(二)
1.变量的存储以及变量的几种类型 变量:用来在计算机当中存储数据. 存储变量的语法: 变量类型 变量名: 变量名=值: int number=100: 2.赋值"=" " ...
- Needed Learning(Updating)
决定把掌握不熟练或是模型见的少的知识点在这里列一列 希望能在自己AFO前成功get技能点吧…… 优先级:动态规划-分治-字符串-图论-数据结构-数学-计算几何-其它 动态规划 1.四边形不等式优化 2 ...
- python 中__name__ = '__main__' 的作用,到底干嘛的?
python 中__name__ = 'main' 的作用,到底干嘛的? 有句话经典的概括了这段代码的意义: "Make a script both importable and execu ...