Android通讯:短信
Android通讯之短信功能实现:
使用android.telephony.SmsManager对象,可以发送短信和彩信。
// 构造回调函数,短信发送结束后,会发出对应的Intent请求
Intent intent = new Intent("com.sample.sms_sent");
intent.putExtra("sms_id",GenerateSmsId());
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intent,0);
// 发送文本短信
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phone_number, null, text_content, pendingIntent,null);
其中,pendingIntent 对象是一个异步的Intent请求,当短信发送完成后,会触发预设在其中的广播事件;通过监听该广播事件,可以获知短信发送的结果:
// 在对应的触发器组件中,监听并处理短信发送的结果
@Override
protected void onHandleIntent(Intent intent){
if("com.sample.sms_sent".equals(intent.getAction())){
long sms_id = intent.getLongExtra("sms_id",0);
int result = intent.getIntExtra("result",0);
// 处理不同的发送结果
if(result == Activity.RESULT_OK){
// 发送成功
......
} else{
// 发送失败
......
}
}
}
通过该方式发送短信,无法与系统的短信数据库整合起来,也就是说通过这种发送出去的短信,无法在其他短信应用中查看,也无法通过其他短信应用来管理其状态。
在很多场景下,开发者如果不是期望在后台发送短信,可以通过发送Intent请求,调用第三方短信应用的界面组件来实现短信的发送。在这种方式下,用户可以对准备发送的短信进行确认和修改,并自行进行发送:
/* 构造短信发送的Intent对象,如果使用Action为Intent.ACTION_SENDTO的方式,可以包含目标地址;如果使用Action为Intent.ACTION_SEND的方式,可以预设短信内容等。*/
final Uri sms = Uri.parse("smsto:1234567");
Intent intent = new Intent(Intent.ACTION_SENDTO,sms);
startActivity(intent);
调用第三方短信界面组件发送短信,不仅能节约开发编辑短信界面的成本,还可以申请短信发送权限,只要场景合适,应该优先使用该方式。但基于第三方组件发送短信的方式,需要用户再次确认,并且无法确认最终的发送结果,在有些场景下并不适合。这时候,就要考虑将短信插入到系统短信数据库的待发送队列来进行短信发送。通过这样的方式,将短信的发送整合到系统短信数据库中,可以通过其他短信应用查看,也可以实现后台的发送和控制。
// 构造需要发送的短信,在对应的数据列上插入对应的值
ContentValues values = new ContentValues();
values.put("address",TARGET_ADDRESS); // 短信地址
values.put("body",SMS_CONTENT); // 短信内容
values.put("type",6); // 短信的类型,6代表待发送短信
values.put("date",CurrentDate()); // 短信发送时间
......
// 将短信插入到数据源
Uri insertUri = getContentResolver().insert("content://sms",values);
// 从插入的地址信息中解析出短信id,通过这个id值,随时可以在数据源中查看短信的状态、内容等信息
long sms_id = Long.valuesOf(insertUri.getLastPathSegment());
......
基于该方式进行的短信发送,可能还存在一定得兼容性隐患。短信数据源属于系统隐藏的数据源组件,其接口和数据库接口的稳定性都不给予保证。一旦在未来某个版本中,短信数据源的地址或数据库结构进行了变更,基于该方式进行的短信发送就可能会失效。
当Android系统从通信底层获取到新的短信信息后,会发出Action为android.provider.Telephony.SMS_RECEIVED的广播事件,通过监听该事件可以读取到新短信的短信内容:
@Override
protected void onHandleIntent(Intent intent){
// 从化名为pdus的Extra域中,读取新短信的内容
Object[] pdus = (object[]) bundle.get("pdus");
// 把所有数据块中的内容抽取出来,拼接成完整的短信内容
String sms_content;
SmsMessage[] messages = new SmsMessage[pdus.length];
for( int i=0;i<messages.length;i++){
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
sms_content += messages[i].getDisplayMessageBody();
}
// 其余信息,均可以从第一个短信数据块中抽取出来
SmsMessage first_message = messages[0];
String address = first_message.getDisplayOriginatingAddress();
int status = first_message.getStatus();
......
}
在实际开发中,需要特别留意该触发器组件的优先级。因为该广播事件是一个有序的事件广播,系统会按照触发器组件的优先级,从高到低依次进行通知。
Androidmanifest中添加发送短信的权限:
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
示例代码下载链接:http://www.apkbus.com/android-137411-1-1.html
参考文章链接:
Android通讯:短信的更多相关文章
- Android获取短信验证码
Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发送验证码的方式,来保护用户个人信息的安全性.无论是用户注册时的信息验证还是当用户发 ...
- Android接收短信
Android收到短信时会广播android.provider.Telephony.SMS_RECEIVED消息,因此只要定义一个Receiver,收听该消息,就能接收短信. <receiver ...
- android拦截短信并屏蔽系统的Notification
拦截短信有几个关键点: 1.android接收短信时是以广播的方式 2.程序只要在自己的Manifest.xml里加有"接收"SMS的权限 <uses-permission ...
- android 发送短信 怎样做到一条一条的发送,仅仅有在上一条发送成功之后才发送下一条短信
android发送短信截获上一条发送是否成功,然后再来发送下一条短信 1.问题:在项目中遇到例如以下要求:待发短信有N条,实现一条一条的发送并在上一条短信发送成功之后再来发送下一条. for(int ...
- android 发送短信的两种方式,以及接收报告和发送报告
android发送短信,以及接收报告和发送报告 android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下: 一.调起系统发短信功能 ...
- android 获取短信验证码倒计时
android 获取短信验证码倒计时 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWVuZ2xlbGUxMzE0/font/5a6L5L2T/fonts ...
- Android之——短信的备份与还原
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47091281 眼下,Android手机中的一些软件能够实现手机短信的备份与还原操作 ...
- ThinkPHP 提供Auth 权限管理、支付宝、微信支付、阿里oss、友盟推送、融云即时通讯、云通讯短信、Email、Excel、PDF 等等
多功能 THinkPHP 开源框架 项目简介:使用 THinkPHP 开发项目的过程中把一些常用的功能或者第三方 sdk 整合好,开源供亲们参考,如 Auth 权限管理.支付宝.微信支付.阿里oss. ...
- 用Tasker实现收到Android手机短信自动转发到邮箱
发送短信到邮箱的原理与 <用Tasker实现收到Android手机短信自动转发到邮箱>有些类似. 发送短信到邮箱是利用Ifttt这个服务将短信转发到邮箱中.Ifttt服务的可扩展性很强, ...
- android接收短信——framework处理流程(android 5.1)
modem层不懂,所以直接从RIL.java开始.以电信卡接收短信为例 modem通知RIL.java中的 RILReceiver处理接收信息 class RILReceiver implements ...
随机推荐
- Some Interesting Problems(持续更新中)
这种题目详解,是“一日一测”与“一句话题解”栏目所无法覆盖的,可能是考试用题,也可能是OJ题目.常常非常经典,可以见微知著.故选其精华,小列如下. T1:fleet 给定一个序列,询问[L,R]间有多 ...
- 洛谷P3474 KUP-Plot purchase
简要题意: 给你一个n * n的非负矩阵,求问是否有子矩阵满足和在[k, 2k]之间.若有输出方案.n<=2000. 解: 首先n4暴力很好想(废话),然后发现可以优化成n3log2n,但是还是 ...
- B1003. 我要通过!
“答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”. 得到“答案正确”的条件是: 1 ...
- MSXML2.ServerXMLHTTP & HTTPS & 证书过期 — msxml3.dll '80072f05'
昨天测试一个几天前写的一个应用,时不时的报错: msxml3.dll '80072f05' The date in the certificate is invalid or has expired ...
- windows中的mysql修改管理员密码
上周安装了Mysl 但是却无法登陆,找了好久才找到这个解决办法,讲的详细谢谢了. [摘要:1.my-default.ini 更名my.ini 正在解压的目次上面复造my-default.ini一份更名 ...
- Linux下环境变量设置技巧
Linux下环境变量设置技巧,不用/etc/profile而是在/etc/profile.d目录下新建特定的shell文件来设置 区别: 1.两个文件都是设置环境变量文件的,/etc/profile是 ...
- 推荐几个精致的web UI框架及常用前端UI框架
1.Aliceui Aliceui是支付宝的样式解决方案,是一套精选的基于 spm 生态圈的样式模块集合,是 Arale 的子集,也是一套模块化的样式命名和组织规范,是写 CSS 的更好方式. git ...
- python -- 异步IO 协程
python 3.4 >>> import asyncio >>> from datetime import datetime >>> @asyn ...
- Win Server 2008 R2 IIS 默认只能添加一个 443 HTTPS 端口
问题: 解决方案: 方法一: 然后在:C:\Windows\system32\inetsrv\config\applicationHost.config 找到 对应网站 <binding pro ...
- javascript innerHTML、outerHTML、innerText、outerText的区别(转)
1.功能讲解: innerHTML 设置或获取位于对象起始和结束标签内的 HTML outerHTML 设置或获取对象及其内容的 HTML 形式 innerText 设置或获取位于对象起始和结束标签内 ...