短信是否送达android,android – 通过Intent发送短信,并知道短信是否已被发送

在以下示例中,我们使用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);

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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值