文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android如何实现接收和发送短信

2022-06-06 07:50

关注

每一部手机都具有短信接收和发送功能,下面我们通过代码来实现接收和发送短信功能。 

一、接收短信

1、创建内部广播接收器类,接收系统发出的短信广播
2、从获得的内容中解析出短信发送者和短信内容
3、在Activity中注册广播
4、添加接收短信权限

下面放上具体的代码 
activity_main.xml文件用于显示短信发送者号码和显示短信内容


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <TextView
    android:id="@+id/sms_from"
    android:layout_width="wrap_content"
    android:layout_height="20dp"
    android:text="From" />
  <TextView
    android:id="@+id/sms_from_txt"
    android:layout_width="wrap_content"
    android:layout_height="20dp"
    android:layout_marginLeft="15dp"
    android:layout_toRightOf="@id/sms_from"/>
  <TextView
    android:id="@+id/sms_content"
    android:layout_width="wrap_content"
    android:layout_height="20dp"
    android:layout_below="@id/sms_from"
    android:layout_marginTop="20dp"
    android:text="Content" />
  <TextView
    android:id="@+id/sms_content_txt"
    android:layout_width="wrap_content"
    android:layout_height="20dp"
    android:layout_marginLeft="15dp"
    android:layout_marginTop="20dp"
    android:layout_below="@id/sms_from_txt"
    android:layout_toRightOf="@id/sms_content"/>
</RelativeLayout>

MainActivity.java文件


public class MainActivity extends AppCompatActivity {
  private TextView fromTv;
  private TextView contentTv;
  private IntentFilter intentFilter;
  private MessageReceiver messageReceiver;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    getSms();
  }
  private void getSms() {
    intentFilter = new IntentFilter();                 intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
    messageReceiver = new MessageReceiver();
    //设置较高的优先级
    intentFilter.setPriority(100);
    registerReceiver(messageReceiver, intentFilter);
  }
  private void initView() {
    fromTv = (TextView) findViewById(R.id.sms_from_txt);
    contentTv = (TextView) findViewById(R.id.sms_content_txt);
  }
  @Override
  protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(messageReceiver);
  }
  class MessageReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
      Bundle bundle = intent.getExtras();
      //提取短信消息
      Object[] pdus = (Object[]) bundle.get("pdus");
      SmsMessage[] messages = new SmsMessage[pdus.length];
      for (int i = 0; i < messages.length; i++) {
        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
      }
      //获取发送方号码
      String address = messages[0].getOriginatingAddress();
      String fullMessage = "";
      for (SmsMessage message : messages) {
        //获取短信内容
        fullMessage += message.getMessageBody();
      }
      //截断广播,阻止其继续被Android自带的短信程序接收到
      abortBroadcast();
      fromTv.setText(address);
      contentTv.setText(fullMessage);
    }
  }
}

注:注册的广播接收器,一定要在OnDestroy()方法中取消注册。

由于短信广播是有序广播,如果我们不想让Android自带的短信程序接收到短信,就可以设置我们自身接收器的优先级,同时在我们接受完广播后将广播截断,阻止其被Android自带的短信程序接收到。 

二、发送短信

1、获取接收者的号码和短信内容
2、获得短信发送管理实例
3、构造PendingIntent启动短信发送状态监控广播
4、调用发送短信函数,传入参数发送短信
5、构造广播接收器内部类监控短信是否发送成功
6、获得广播接收器实例和IntentFilter实例,注册广播接收器
7、在onDestroy()中取消注册的广播接收器
8、在AndroidManifest.xml文件中加入短信发送权限

下面放上具体的布局文件和代码 
activity_send_msg.xml文件


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <EditText
    android:id="@+id/to_ed"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:hint="to"/>
  <EditText
    android:id="@+id/to_content"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_below="@id/to_ed"
    android:hint="content"/>
  <Button
    android:id="@+id/send_msg"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_below="@id/to_content"
    android:text="@string/send_message"/>
</RelativeLayout>

SendMsgActivity.java文件


public class SendMsgActivity extends AppCompatActivity implements View.OnClickListener {
  private Context context;
  private EditText toEdit;
  private EditText toContent;
  private IntentFilter sendFilter;
  private SendStatusReceiver sendStatusReceiver;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_send_msg);
    context = this;
    initView();
  }
  private void initView() {
    toEdit = (EditText) findViewById(R.id.to_ed);
    toContent = (EditText) findViewById(R.id.to_content);
    //添加发送按钮的点击监听事件
    Button sendMsg = (Button) findViewById(R.id.send_msg);
    sendMsg.setOnClickListener(this);
  }
  @Override
  public void onClick(View view) {
    switch (view.getId()){
      case R.id.send_msg:
        sendMessage();
       break;
      default:
        break;
    }
  }
  private void sendMessage() {
    //获取短信接收者号码
    String to = toEdit.getText().toString();
    //获取发送短信内容
    String content = toContent.getText().toString();
    //获得广播接收器实例和IntentFilter实例
    sendStatusReceiver = new SendStatusReceiver();
    sendFilter = new IntentFilter();
    sendFilter.addAction("SENT_SMS_ACTION");
    //注册广播监听
    registerReceiver(sendStatusReceiver, sendFilter);
    //构造PendingIntent启动短信发送状态监控广播
    Intent sendIntent = new Intent("SENT_SMS_ACTION");
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, sendIntent, 0);
    //获得短信管理实例
    SmsManager smsManager = SmsManager.getDefault();
    //调用发送短信函数,传入参数发送短信(第一、三、四参数依次为接收者号码,短信内容,短信发送状态监控的PendingIntent)
    smsManager.sendTextMessage(to, null, content, pi, null);
  }
  
  class SendStatusReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
      if (getResultCode() == RESULT_OK){
        Toast.makeText(context, "successful", Toast.LENGTH_SHORT).show();
      }else{
        Toast.makeText(context, "failed", Toast.LENGTH_SHORT).show();
      }
    }
  }
  @Override
  protected void onDestroy() {
    super.onDestroy();
    //取消注册的广播
    unregisterReceiver(sendStatusReceiver);
  }
}

在AndroidManifest.xml文件中加入短信发送权限 
<uses-permission android:name="android.permission.SEND_SMS"/>

您可能感兴趣的文章:Android开发工程中集成mob短信验证码功能的方法Android手机号注册、绑定手机号获取短信验证码实例Android获取和读取短信验证码的实现方法Android实现自动提取短信验证码功能Android实现短信验证码自动填写功能Android黑科技之读取用户短信+修改系统短信数据库android短信拦截的实现代码android教程之intent的action属性使用示例(intent发短信)获取Android手机中所有短信的实现代码Android短信接收监听、自动回复短信操作例子


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯