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通讯:短信的更多相关文章

  1. Android获取短信验证码

    Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发送验证码的方式,来保护用户个人信息的安全性.无论是用户注册时的信息验证还是当用户发 ...

  2. Android接收短信

    Android收到短信时会广播android.provider.Telephony.SMS_RECEIVED消息,因此只要定义一个Receiver,收听该消息,就能接收短信. <receiver ...

  3. android拦截短信并屏蔽系统的Notification

    拦截短信有几个关键点: 1.android接收短信时是以广播的方式 2.程序只要在自己的Manifest.xml里加有"接收"SMS的权限 <uses-permission  ...

  4. android 发送短信 怎样做到一条一条的发送,仅仅有在上一条发送成功之后才发送下一条短信

    android发送短信截获上一条发送是否成功,然后再来发送下一条短信 1.问题:在项目中遇到例如以下要求:待发短信有N条,实现一条一条的发送并在上一条短信发送成功之后再来发送下一条. for(int ...

  5. android 发送短信的两种方式,以及接收报告和发送报告

               android发送短信,以及接收报告和发送报告          android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下:    一.调起系统发短信功能    ...

  6. android 获取短信验证码倒计时

    android 获取短信验证码倒计时 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWVuZ2xlbGUxMzE0/font/5a6L5L2T/fonts ...

  7. Android之——短信的备份与还原

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47091281 眼下,Android手机中的一些软件能够实现手机短信的备份与还原操作 ...

  8. ThinkPHP 提供Auth 权限管理、支付宝、微信支付、阿里oss、友盟推送、融云即时通讯、云通讯短信、Email、Excel、PDF 等等

    多功能 THinkPHP 开源框架 项目简介:使用 THinkPHP 开发项目的过程中把一些常用的功能或者第三方 sdk 整合好,开源供亲们参考,如 Auth 权限管理.支付宝.微信支付.阿里oss. ...

  9. 用Tasker实现收到Android手机短信自动转发到邮箱

    发送短信到邮箱的原理与 <用Tasker实现收到Android手机短信自动转发到邮箱>有些类似.  发送短信到邮箱是利用Ifttt这个服务将短信转发到邮箱中.Ifttt服务的可扩展性很强, ...

  10. android接收短信——framework处理流程(android 5.1)

    modem层不懂,所以直接从RIL.java开始.以电信卡接收短信为例 modem通知RIL.java中的 RILReceiver处理接收信息 class RILReceiver implements ...

随机推荐

  1. source insight的使用方法逆天整理

    http://www.cnblogs.com/ningskyer/articles/4038501.html A. why SI: 为什么要用Source Insight呢?因为她比完整的IDE要更快 ...

  2. code::Blocks生成的dll 在 java jni 调用遇到的问题

    Test.java__________________________________ public class Test{    public static native void p(); pub ...

  3. Machine Learning Netsite

    Google:  Machine Learning

  4. HDU2072 tri树/map/set/字符串hash

    lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题 水题 就是用来试试字符串算法的 tri树 ...

  5. python3简单实现微信爬虫

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  6. 编译安装php-7.1.17及部分扩展

    ./configure --prefix=/usr/local/php-7.1.17 --disable-debug --enable-shmop --with-gd --with-jpeg-dir= ...

  7. 在windows环境下实现开机延迟启动tomcat

    如果说我们的服务器断电了 开机之后还需要手动开下服务  还需要远程连接上  然后一个一个开启  是不是很麻烦  我们可以写一个bat脚本  然后设置开机5分钟之后启动tomcat 首先配置环境变量: ...

  8. JavaScript中的栈和堆内存,作用域

    1.栈 stack”和“堆 heap”            简单的来讲,stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里.stack一般是静态 ...

  9. Windows 上安装 Redis 及可能出现的错误和解决方法!

    前言 Redis(REmote Dictionary Server) 是一种以key-value写得存储系统.他是开源的ANSI语言编写的.遵守BSD协议.被称作“数据结构服务器”,因为它的值(val ...

  10. weblogic/tomcat Get乱码【转】

    引用自:http://www.cnblogs.com/1995hxt/p/4982835.html  (非常清晰) 其它好文 tomcat和weblogic设置编码方式 tomcat解决方案 在con ...