在以下示例中,我们使用ContentObserver来监视SMS提供程序的更新.此Observer在SMS Intent被触发之前创建并启动,并根据目标地址检查Provider更改.创建Observer的Activity必须实现SmsSendObserver.SmsSendListener接口才能接收回调.

Observer的构造函数包含一个超时参数(以毫秒为单位),如果在一段合理的时间后没有发送消息,则允许Obse​​rver正确注销.如果需要,可以将其设置为NO_TIMEOUT.但是,如上所述,该类用于“一次性”使用,并且它将取消注册自身并在回调时使成员无效.如果没有回调,stop()方法可用于清理.在任何一种情况下,实例都不再可用,并且对它的任何引用都应设置为null.

示例活动:

public class MainActivity extends Activity

implements SmsSendObserver.SmsSendListener {

...

private void sendMessage(String phoneNumber, String messageBody) {

// This example has a timeout set to 15 seconds

new SmsSendObserver(this, phoneNumber, 15000).start();

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setData(Uri.parse("smsto:" + phoneNumber));

intent.putExtra("address", phoneNumber);

intent.putExtra("sms_body", messageBody);

intent.putExtra("exit_on_sent", true);

startActivity(intent);

}

public void onSmsSendEvent(boolean sent) {

Toast.makeText(this, sent ? "Message was sent" : "Timed out",

Toast.LENGTH_SHORT).show();

}

}

SmsSendObserver类:

public class SmsSendObserver extends ContentObserver {

public static final int NO_TIMEOUT = -1;

private static final Handler handler = new Handler();

private static final Uri uri = Uri.parse("content://sms/");

private static final String COLUMN_ADDRESS = "address";

private static final String COLUMN_TYPE = "type";

private static final String[] PROJECTION = { COLUMN_ADDRESS, COLUMN_TYPE };

private static final int MESSAGE_TYPE_SENT = 2;

private Context context = null;

private ContentResolver resolver = null;

private String phoneNumber = null;

private long timeout = NO_TIMEOUT;

private boolean wasSent = false;

private boolean timedOut = false;

public SmsSendObserver(Context context, String phoneNumber, long timeout) {

super(handler);

if (context instanceof SmsSendListener) {

this.context = context;

this.resolver = context.getContentResolver();

this.phoneNumber = phoneNumber;

this.timeout = timeout;

}

else {

throw new IllegalArgumentException(

"Context must implement SmsSendListener interface");

}

}

private Runnable runOut = new Runnable() {

@Override

public void run() {

if (!wasSent) {

timedOut = true;

callBack();

}

}

};

public void start() {

if (resolver != null) {

resolver.registerContentObserver(uri, true, this);

if (timeout > NO_TIMEOUT) {

handler.postDelayed(runOut, timeout);

}

}

else {

throw new IllegalStateException(

"Current SmsSendObserver instance is invalid");

}

}

public void stop() {

if (resolver != null) {

resolver.unregisterContentObserver(this);

resolver = null;

context = null;

}

}

private void callBack() {

((SmsSendListener) context).onSmsSendEvent(wasSent);

stop();

}

@Override

public void onChange(boolean selfChange) {

if (wasSent || timedOut)

return;

Cursor cursor = null;

try {

cursor = resolver.query(uri, PROJECTION, null, null, null);

if (cursor != null && cursor.moveToFirst()) {

final String address =

cursor.getString(cursor.getColumnIndex(COLUMN_ADDRESS));

final int type =

cursor.getInt(cursor.getColumnIndex(COLUMN_TYPE));

if (PhoneNumberUtils.compare(address, phoneNumber) &&

type == MESSAGE_TYPE_SENT) {

wasSent = true;

callBack();

}

}

}

finally {

if (cursor != null) {

cursor.close();

}

}

}

public interface SmsSendListener {

// Passes true if the message was sent

// Passes false if timed out

public void onSmsSendEvent(boolean sent);

}

}

android intent短信,android – 通过Intent发送短信,并知道短信是否已被发送相关推荐

  1. Android中使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信

    场景 点击拨打电话按钮,跳转到拨打电话页面 点击发送短信按钮,跳转到发送短信页面 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程 ...

  2. android(30)(短信助手,intent和activity数据的回传startActivityForResult)

    1.主页布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns ...

  3. android不调用系统发送短信,android之两种方式调用短信发送接口

    释放双眼,带上耳机,听听看~! 相信很多程序员在开发程序的时候都会遇到短信调用端口的情况,今天是技术狗小编为大家带来的关于android之两种方式调用短信发送接口,希望对你学习这方面知识有帮助! an ...

  4. Android短信的发送和广播接收者实现短信的监听

    Android短信的发送和广播接收者实现短信的监听  要注意Android清单中权限的设置以及广播的注册监听实现 以下就是 Android清单的XML AndroidManifest.xml < ...

  5. android 开发 短信,Android开发之短信发送

    今天要讲的是使用Android开发发送短信程序.我们先来看下运行效果 图(1)                                                              ...

  6. Android实现拨打电话和发送短信,Android手机拨打电话、手动发送短信与自动拨打电话、自动发送短信(代码很简单哦)...

    Android实现手动拨打电话,即点击后跳转到手机默认电话号码输入页面,可以将相应号码传送过去: Intent intent = new Intent(Intent.ACTION_DIAL, Uri. ...

  7. android 脚本发短信,Android使用SmsManager实现短信发送功能

    安卓使用SmsManager实现发送短信,供大家参考,具体内容如下 关键代码实现 package com.example.sms; import java.util.ArrayList; import ...

  8. android开发发送短信,Android开发入门之发送短信

    第一步:新建一个Android工程命名为03.Sms目录结构如下图: 第二步:修改activity_main.xml布局文件代码如下: xmlns:tools="http://schemas ...

  9. android 调用短信,android中可以通过两种方式调用接口发送短信

    第一:调用系统短信接口直接发送短信:主要代码如下: //直接调用短信接口发短信 SmsManager smsManager = SmsManager.getDefault(); List divide ...

最新文章

  1. 脑细胞膜等效神经网路12分类实例
  2. 安装Kali Linux操作系统Kali Linux无线网络渗透
  3. python3最新稳定版本-python稳定版本
  4. css a 标签上下间距_CSS实用技能:去除inline-block元素间间距的7种方法
  5. 百度地图示例左侧的代码编辑器Ace Editor
  6. POJ1328-Radar Installation
  7. oracle删除表空间中的表,ORACLE删除表空间中的所有表
  8. Java位操作:如何将long类型的指定位设置为0或1?How to set/unset a bit at specific position of a long?
  9. 2016/1/4 学习笔记 数据类型转换 注释 语句
  10. 到底什么是空指针?如何避免空指针_01
  11. 苹果优化iPhone 12 Pro人脸识别,指纹识别还是别想了
  12. Session基础知识
  13. Winboard - X
  14. 博弈论学习笔记——博弈收益期望的计算与决策
  15. 计算机语言26个字母,C 语言实例 - 循环输出26个字母
  16. 网络分流器-TCP报文重组和会话规则-网络分流器
  17. 解决three.js渲染gltf 模型与gltfViewer网站效果不一致问题 krpano发黑问题 three.js gltf模型渲染发黑问题
  18. CHAP7 软件项目进度计划
  19. MQ(message queue)使用 Spring整合 MQ下载 五分钟上手使用
  20. HDUOJ1865 1string

热门文章

  1. 从Java到Kotlin(五)
  2. Apache activemq入门示例(maven项目)
  3. linux学习笔记-第一课-linux的历史,安装linux,远程连接
  4. 某石油公司100-500人办公网络方案设计
  5. 网站社区类产品管理经验
  6. TRUNK配置详细讲解
  7. java之 代理设计模式
  8. 深入理解面向对象 -- 基于 JavaScript 实现
  9. python接口自动化(二十四)--unittest断言——中(详解)
  10. rewirte 规则