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

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

一、接收短信

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"/>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android短信拦截的实现代码

    短信拦截的实现主要是使用了广播接收者来实现. BroadcastReceiver  广播接收者   必须指定要接收的广播类型.必须明确的指定action 广播:事件.普通广播: 是异步的.会广播接收者同时接收,不能被中断sendBroadcast()有序广播: 是同步的.会根据广播接收的优先级进行接收,是可以中断   短信到来广播 sendOrderBroadcast()priority的范围是:-1000 ~ 1000如果有序广播明确的指定了广播接收者,他是无法被中断的. 代码实现如下: 1.

  • Android短信接收监听、自动回复短信操作例子

    定义广播接收器的Action: 复制代码 代码如下: private static final String TAG ="SmsService";/*** 信息发送状态广播*/private static final String ACTION_SMS_SEND  = "com.SmsService.send";  /*** 信息接收状态广播*/private static final String ACTION_SMS_DELIVERY = "com.S

  • Android实现自动提取短信验证码功能

    本文实例讲解了Android自动提取短信验证码解决方案,分享给大家供大家参考,具体内容如下 主要功能及优点 1.收到验证码短信后,自动提取短信中的验证码填写到相应输入框 2.可指定一个号码,只读取与他有关短信,避免提取来源错误 3.利用正则表达式,可匹配各种类型验证码 模块集成关键步骤     将auto_getcode_demo中src包里的SMSContentObserver类复制到你的项目src包中 在SMSContentObserver中:    修改正则表达式内容来匹配自己想要获取的字

  • Android黑科技之读取用户短信+修改系统短信数据库

    安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波"黑科技". 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证码,一些app马上就能自动获取并填上验证码,省去我们手动填写验证码.原理就是通过Android的ContentProvider组件间接访问系统的短信数据库,获取所有短信内容.下面来演示一下. 布局很简单,如下: 代码如下: public class MainActivity extends

  • Android获取和读取短信验证码的实现方法

    现如今,验证码在Android的客户端还是非常普遍的.通过手机账号和验证码直接去注册应用账户的信息.很多应用都以这种方式来完成注册.简单的介绍一下吧. Android获取短信验证码还是比较简单的,通过Mob官网提供的ShareSDK,调用其中内部的方法,就可以获取到短信的验证码了.提供一下Mob的官网地址.http://www.mob.com/#/在官网上注册相关的信息之后,下载相关的jar包和.so文件就可以实现获取短信验证码了(2.0之前的版本都需要下载jar包和 .so文件,而现在的2.2

  • Android实现短信验证码自动填写功能

    本实例为大家分享了Android实现短信验证码自动填写功能,供大家参考,具体内容如下 实现思路很简单: 1.在需要输入验证码的Activity代码注册监听短信的广播 2.拦截短信,获取其中的验证码 3.回写到EditText private SmsReciver smsReciver = new SmsReciver(); /** 收到短信Action **/ String ACTION_SMS_RECIVER = "android.provider.Telephony.SMS_RECEIVED

  • android教程之intent的action属性使用示例(intent发短信)

    Action :规定了Intent要完成的动作,是一个字符串常量.使用setAction()来设置Action属性,使用getAction()来获得Action属性.既可以使用系统内置的Action,也可以自己定义.系统自定义的action,如ACTION_VIEW, ACTION_EDIT, ACTION_MAIN等等. 1.自定义Action 在"目的Activity"的AndroidManifest.xml中指定action常量. 复制代码 代码如下: <activity

  • Android开发工程中集成mob短信验证码功能的方法

    一.前言 现在的app基本上都需要用到短信功能,注册时或者有消息通知时需要给用户发送一条短信,但是对于个人开发者来说,去买第三方的短信服务实在是有点奢侈,很好的是mob为我们提供了免费的短信验证码服务功能,我不是打广告,的确觉得这项服务很不错.那么下面就简单讲一下如何在自己的工程里集成mob的短信功能,其实整个流程并不复杂,只是个人觉得mob的官方文档有点小乱,官方Demo也有点小复杂,同时有一些细节地方容易被忽视,也会导致一些问题. PS:太喜欢mob的logo了. 二.实现过程 本篇只涉及A

  • Android手机号注册、绑定手机号获取短信验证码实例

    本文写了一个常见的功能--手机app中注册或绑定手机号的获取验证码的功能,也就是短信验证功能 具体效果就是,你在注册界面填写手机号,点击获取验证码按钮,---然后会收到验证短信,填入验证码后点击注册按钮,如果验证正确就可以跳转到另外一个界面 1.首先大家需要在mob官网注册一个账号,mob是一个免费的短信验证平台 2.在mob.com后台创建应用 3.下载对应的sdk 4.将sdk作为一个library导入到你的项目中 5.现在就可以在你的项目中编写代码使用mob提供的这个功能了 具体代码如下:

  • 获取Android手机中所有短信的实现代码

    Java核心代码: public String getSmsInPhone() { final String SMS_URI_ALL = "content://sms/"; final String SMS_URI_INBOX = "content://sms/inbox"; final String SMS_URI_SEND = "content://sms/sent"; final String SMS_URI_DRAFT = "c

随机推荐