实践--应用广播收发短信

接收短信
  • 接收短信的Action为android.provider.Telephony.SMS_RECEIVED
public class MainActivity extends AppCompatActivity {

    private TextView textView_msgNum,textView_msgContent;
    private MyMsgReceiver myMsgReceiver;
    private IntentFilter receiveFilter;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
        receiveFilter.setPriority(100);
        registerReceiver(myMsgReceiver, receiveFilter);

    }

    private void init() {
        textView_msgNum= (TextView) findViewById(R.id.textView_msgNum);
        textView_msgContent= (TextView) findViewById(R.id.textView_msgContent);
        myMsgReceiver=new MyMsgReceiver();
        receiveFilter =new IntentFilter();
    }

    class MyMsgReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle=intent.getExtras();
            //提取短信消息
            Object[] pdus= (Object[]) bundle.get("pdus");
            SmsMessage[] msgs=new SmsMessage[pdus.length];
            for (int i=0;i<msgs.length;i++){
                msgs[i]=SmsMessage.createFromPdu((byte[]) pdus[i]);
            }
            String address=msgs[0].getOriginatingAddress();
            String content="";
            for (SmsMessage msg:msgs){
                content+=msg.getMessageBody();
            }

            textView_msgNum.setText(address);
            textView_msgContent.setText(content);
            abortBroadcast();
        }
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        unregisterReceiver(myMsgReceiver);
    }
}
  • 记得在androidManifest文件中添加接收短信的权限
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
  • 创建一个内部类MyMsgReceiver 广播接收器,并在其中写接收短信的逻辑代码
    class MyMsgReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle=intent.getExtras();
            //提取短信消息
            Object[] pdus= (Object[]) bundle.get("pdus");
            SmsMessage[] msgs=new SmsMessage[pdus.length];
            for (int i=0;i<msgs.length;i++){
                //将pdu字节数组转换为SmsMessage对象
                msgs[i]=SmsMessage.createFromPdu((byte[]) pdus[i]);
            }
            //获取发信人号码
            String address=msgs[0].getOriginatingAddress();
            String content="";
            for (SmsMessage msg:msgs){
                //获取短信内容
                content+=msg.getMessageBody();
            }

            textView_msgNum.setText(address);
            textView_msgContent.setText(content);
            abortBroadcast();
        }
    }
  • 据说将receiveFilter.setPriority(100);,再通过abortBroadcast();将广播截断,系统短信就不会再接收到短信,这就是拦截短息的原理
  • 但是我试了不行,不知道为什么。。。。。。。。。

这里写图片描述

发送短信
  • 发送短信的权限为
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
  • 发送短信的逻辑代码如下
  • 实现在点击发送按钮的时候,将短信发送出去的功能,顺便通过广播的方式来反馈给用户,是否发送成功
public class MainActivity extends AppCompatActivity {

    private TextView textView_msgNum,textView_msgContent;
    private IntentFilter sendFilter;
    private EditText editText_msgNum,editText_msgContent;
    private Button button_send;
    private SendStatusReceiver sendStatusReceiver;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        sendFilter.addAction("SEND_SMS_ACTION");
        registerReceiver(sendStatusReceiver,sendFilter);

        button_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent("SEND_SMS_ACTION");
                PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this,0,intent,0);
                SmsManager manager=SmsManager.getDefault();
                            manager.sendTextMessage(editText_msgNum.getText().toString(),null,editText_msgContent.getText().toString(),pendingIntent,null);
            }
        });

    }

    private void init() {
        editText_msgNum= (EditText) findViewById(R.id.editView_msgNum);
        editText_msgContent= (EditText) findViewById(R.id.editView_msgContent);
        button_send= (Button) findViewById(R.id.button_send);
        sendStatusReceiver=new SendStatusReceiver();
        sendFilter=new IntentFilter();
    }
    class SendStatusReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            if (getResultCode()==RESULT_OK){
                Toast.makeText(MainActivity.this, "发送成功", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(MainActivity.this, "发送失败", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        unregisterReceiver(sendStatusReceiver);
    }
}
  • 首先我们来开点击事件中的逻辑代码
Intent intent=new Intent("SEND_SMS_ACTION");
                PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this,0,intent,0);
                SmsManager manager=SmsManager.getDefault();
                 manager.sendTextMessage(editText_msgNum.getText().toString(),null,editText_msgContent.getText().toString(),pendingIntent,null);
  • 首先我们通过SmsManager.getDefault()来获取SmsManager的实例,
  • 然后通过sendTextMessage()方法发送信息,此方法接收五个参数
  • 第一个参数用于指定接收人的手机号码
  • 第三个参数用于指定短信的内容
  • 第四个参数是一个PendingIntent对象,用于开启广播接收器,监控短信发送状态
  • 其它参数我们暂时不用,传入null

  • 为了了解短信是否发送成功,我们需要自定义一个监视发送状态的广播接收器,通过PendingIntent开启监控的广播,在广播中进行发送状态的判断,并吐司提示用户。

  • 效果图

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值