Android发送短信最简单代码实现

这篇具有很好参考价值的文章主要介绍了Android发送短信最简单代码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现效果如下:(为了尽量使用最少的代码实现功能,界面十分简单,方便理解原理)

这边我输入短信内容为"252525"

   android.permission.send_sms,android,java,开发语言

                                                                                      图一  输入发送号码和指定内容

   android.permission.send_sms,android,java,开发语言

                                                                                           图二  第一条为收到的短信

下面介绍代码实现:

在manifest.xml中添加权限:(不同的手机操作系统不同,有的手机需要更多的权限,比如小米手机需要打开通知权限,不然操作系统不会允许app发送通知类短信)

    <uses-permission android:name="android.permission.SEND_SMS" />  <!--发送短信-->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!--访问电话状态-->

    <uses-permission android:name="android.permission.RECEIVE_SMS" /> <!--接收短信-->
    <uses-permission android:name="android.permission.READ_SMS" /><!--    读取短信内容-->

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

正常情况下只要添加一行权限:

<uses-permission android:name="android.permission.SEND_SMS" />  <!--发送短信-->

前端xml代码:activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <EditText
        android:id="@+id/edPhone1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入手机号码"
        android:inputType="phone"
        android:minHeight="48dp" />

    <EditText
        android:id="@+id/edContent1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="内容"
        android:inputType="phone"
        android:minHeight="48dp" />

    <Button
        android:id="@+id/bt_sendSMSS"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送" />

</LinearLayout>

预览界面:

                                          android.permission.send_sms,android,java,开发语言

                                                                         图三  布局预览

后端代码 MainActivity.java: 

public class MainActivity extends AppCompatActivity {

    private EditText edContent;
    private EditText edPhone;

    private static final int SEND_SMS = 100;


    private static final String SMS_SENT_ACTION = "SMS_SENT";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        edContent = findViewById(R.id.edContent1);
        edPhone = findViewById(R.id.edPhone1);
        Button btSend = findViewById(R.id.bt_sendSMSS);
        btSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                requestPermission();
            }
        });
    }




    private void requestPermission() {
        //判断Android版本是否大于23
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            int checkCallPhonePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE);
            if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, SEND_SMS);
                return;
            } else {
                sendSMSS();
                //已有权限
            }
        } else {
            //API 版本在23以下
        }
    }

    /**
     * 注册权限申请回调
     *
     * @param requestCode  申请码
     * @param permissions  申请的权限
     * @param grantResults 结果
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case SEND_SMS:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    sendSMSS();
                } else {
                    // Permission Denied
                    Toast.makeText(MainActivity.this, "SEND_SMS Denied", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    //发送短信
    private void sendSMSS() {
        String content = edContent.getText().toString().trim();
        String phone = edPhone.getText().toString().trim();
        Log.d("手机",phone);
        if (!isEmpty(content) && !isEmpty(phone)) {
            SmsManager manager = SmsManager.getDefault();
            ArrayList<String> strings = manager.divideMessage(content);
            for (int i = 0; i < strings.size(); i++) {
                boolean isMessageSent = false;
                try {
                    manager.sendTextMessage(phone, null, content, null, null);
                    isMessageSent = true;
                } catch (Exception e) {
                    e.printStackTrace();
                }

                if (isMessageSent) {
                    Log.d("发送状态","成功");
                    // 短信发送成功
                } else {
                    Log.d("发送状态","失败");
                    // 短信发送失败
                }

            }
            Toast.makeText(MainActivity.this, "发送成功", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "手机号或内容不能为空", Toast.LENGTH_SHORT).show();
            return;
        }

    }
    @Override
    protected void onDestroy() {
        super.onDestroy();

    }

    public static boolean isEmpty(String str) {

        return str == null || str.trim().isEmpty();
    }
}

在上面代码中发送短信运用smsManager类,最关键的发送短信的函数是manager.sendTextMessage(phone, null, content, null, null); 

manager.sendTextMessage(destinationAddressscAddresstextsentIntentdeliveryIntent),其中destinationAddress指的是接受人,scAddress指的是短信中心服务号码,发送短信需要先转发到中心服务号码进而发送到收件人手机,这边只要设置为null,程序自动检测,text为发送短信的内容,sentIntent: 发送短信结果状态信号,deliveryIntent: 对方接收状态信号(是否已成功接收),都设置为null即可

上面用try-catch结构检测发送状态

如果不用广播监听发送状态的话写以上代码即可,发送失败则可以查看下方广播代码的编写:(以下为带广播的全部代码)

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private EditText edContent;
    private EditText edPhone;

    private static final int SEND_SMS = 100;


    private static final String SMS_SENT_ACTION = "SMS_SENT";




    private BroadcastReceiver smsSentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("MyBroadcastReceiver", "Received broadcast: " + intent.getAction());
            Log.d("code", String.valueOf(getResultCode()));
            switch (getResultCode()) {
                case Activity.RESULT_OK:
                    // 短信发送成功
                    Log.e("signal","成功");
                    Toast.makeText(context, "短信发送成功yyyyy", Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    // 短信发送失败
                    Log.e("signal","失败");
                    Toast.makeText(context, "短信发送失败", Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    // 手机没有信号,无法发送短信
                    Log.e("signal","失败");
                    Toast.makeText(context, "手机无信号,无法发送短信", Toast.LENGTH_SHORT).show();
                    break;
                // 更多其他错误码可根据需要进行处理
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        edContent = findViewById(R.id.edContent1);
        edPhone = findViewById(R.id.edPhone1);
        Button btSend = findViewById(R.id.bt_sendSMSS);
        registerReceiver(smsSentReceiver, new IntentFilter(SMS_SENT_ACTION));
        btSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                requestPermission();
            }
        });
    }




    private void requestPermission() {
        //判断Android版本是否大于23
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            int checkCallPhonePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE);
            if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, SEND_SMS);
                return;
            } else {
                registerReceiver(smsSentReceiver, new IntentFilter(SMS_SENT_ACTION));
                sendSMSS();
                //已有权限
            }
        } else {
            //API 版本在23以下
        }
    }

    /**
     * 注册权限申请回调
     *
     * @param requestCode  申请码
     * @param permissions  申请的权限
     * @param grantResults 结果
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case SEND_SMS:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    sendSMSS();
                } else {
                    // Permission Denied
                    Toast.makeText(MainActivity.this, "SEND_SMS Denied", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    //发送短信
    private void sendSMSS() {
        String content = edContent.getText().toString().trim();
        String phone = edPhone.getText().toString().trim();
        Log.d("手机",phone);
        if (!isEmpty(content) && !isEmpty(phone)) {
            SmsManager manager = SmsManager.getDefault();

            Intent sentIntent = new Intent(SMS_SENT_ACTION);
            PendingIntent sentPendingIntent = PendingIntent.getBroadcast(this, 0, sentIntent, PendingIntent.FLAG_IMMUTABLE);
            

            ArrayList<String> strings = manager.divideMessage(content);
            for (int i = 0; i < strings.size(); i++) {
                boolean isMessageSent = false;
                try {
                    manager.sendTextMessage(phone, null, content, sentPendingIntent, null);
                    isMessageSent = true;
                } catch (Exception e) {
                    e.printStackTrace();
                }

                if (isMessageSent) {
                    Log.d("发送状态","成功");
                    // 短信发送成功
                } else {
                    Log.d("发送状态","失败");
                    // 短信发送失败
                }


            }
            Toast.makeText(MainActivity.this, "发送成功", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "手机号或内容不能为空", Toast.LENGTH_SHORT).show();
            return;
        }

    }
    @Override
    protected void onDestroy() {
        super.onDestroy();

        // 取消注册广播接收器
        unregisterReceiver(smsSentReceiver);
    }
    public static boolean isEmpty(String str) {

        return str == null || str.trim().isEmpty();
    }
}

Intent sentIntent = new Intent(SMS_SENT_ACTION);
PendingIntent sentPendingIntent = PendingIntent.getBroadcast(this, 0, sentIntent, PendingIntent.FLAG_IMMUTABLE);这两行代码为注册广播

在manager.sendTextMessage(phone, null, content, sentPendingIntent, null);中将第四个参数设置为sentPendingIntent

效果:getResultCode()的值为-1是发送成功的状态

         android.permission.send_sms,android,java,开发语言

                                                             图四  控制台截图

 注意:状态为-1不一定等于你一定能够收到短信,以手机收到实际短信为准,仔细检查手机给予app的权限,可以把相关权限都开启,包括通知权限以及发送短消息的权限,不是所有手机都会自动跳出弹窗询问是否开启某项权限的!!可以考虑换机子尝试,smsmanager是用手机默认手机号发送短信的

在Android中,使用SmsManager发送短信并不意味着短信一定会立即被接收到。短信的传递是由运营商网络来处理的,可能会有延迟或其他因素导致短信无法立即到达目标手机号码。

此外,还有一些常见的问题可能导致短信发送成功但未收到短信的情况:

  1. 权限问题:确保你的应用已经获得了发送短信的权限(Manifest.permission.SEND_SMS)并且用户已经授予了该权限。

  2. 目标手机号码正确性:确认你正在发送短信的目标手机号码是正确的,确保手机号码格式正确且有效。

  3. 网络连接问题:确保你的设备处于正常的移动网络或Wi-Fi连接状态,以便发送短信。

  4. 运营商限制:有些运营商可能对短信进行限制,例如在某些国家/地区可能需要预先注册短信服务或开通特定的短信套餐。

如果你仍然无法解决问题,建议你尝试使用其他方法发送短信,例如使用第三方的短信服务提供商或者调用运营商的短信发送接口。文章来源地址https://www.toymoban.com/news/detail-763817.html

到了这里,关于Android发送短信最简单代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序实现发送短信的功能(发送短信)

    我使用的是微信小程序的云开发这种方式来实现的,纯前端操作,无需后端接入。 1,打开微信公众平台中的【云开发】  2,在概览里面点击开通静态网站  3,点击开通  4,确定开通,这地方看上去是要收费的,但是第一个月是有免费的额度给你使用的,后期收不收费要通

    2024年02月09日
    浏览(56)
  • Android连接蓝牙设备问题(android.permission.BLUETOOTH)

            近期遇到一个问题,之前发布的APP连接蓝牙都是正常的,现在有人反映连不上了。经过测试发现:android 12 和 harmonyOS 3.0.0 都会有这个问题,而之前的版本就不会有这个。         经过网上一番查找,原来是因为最近Google发布的Android 12,新引入了 BLUETOOTH_SCAN、

    2024年01月16日
    浏览(47)
  • 2023 node 接入腾讯云短信服务,实现发送短信功能

    1、在 腾讯云开通短信服务,并申请 签名 和 正文模板 腾讯云短信 https://console.cloud.tencent.com/smsv2 a、签名即是短信的开头。例如 【腾讯云短信】xxxxxxx; b、正文模板即短信内容, 变量部分使用 {1} , 数字从1开始累推。例如: 今天是{1}佳节,{2}祝您节日快乐! 1 和 2 即可以我

    2024年02月10日
    浏览(64)
  • Android监听手机短信

    Android监听手机短信的方法有两种,分别为: 1、接受系统的短信广播:当手机收到新消息时,会发送一条广播,通过该广播就可以获取短信内容; 2、监听短信数据库:利用 观察者模式 监听短信数据库,当短信数据库改变时就可以触发观察者模式的onChange()方法,但是onChang回

    2024年02月11日
    浏览(39)
  • 阿里云短信发送接口实现

    使用阿里云短信接口发送验证码 springboot 工程引入web 引入 lombok 关键代码引入 启动项目,访问接口,短信发送成功!

    2024年02月11日
    浏览(46)
  • android设置打开蓝牙时报错:java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission

    我的手机是三星s10,Android12,遇到的这个问题,供参考 问题出现场景,我是最近在研究一下蓝牙相关的,找了文档学习但是触动mBluetoothAdapter.enable();开启或者打开蓝牙的时候就报了下面这个错: 开始解错: 表面提示就是需要许可证/就是权限之类的缺少, 然后我就顺着这个错误去网上

    2024年02月13日
    浏览(46)
  • java 阿里云 发送短信功能实现

            常用短信服务平台:阿里云、华为云、腾讯云、京东、梦网、乐信等         AccessKey 是访问阿里云 API 的密钥,具有账户的完全权限,我们要想在后面通过API调用阿里云短信服务的接口发送短信,那么就必须要设置AccessKey。         控制台页面---点击右上

    2024年02月02日
    浏览(52)
  • Android系统安全之Permission机制

           Android系统的Permission机制是其安全体系的重要组成部分,它允许系统对应用程序的权限进行细分和访问控制,从而确保用户数据的安全和隐私。以下是关于Android系统Permission机制的详细解析:         Android系统采用了基于Linux的权限管理机制,为每一个应用程序分

    2024年04月17日
    浏览(33)
  • 短信生成器部分思路----Android

    该app可以自己给自己发短信,包括发送人手机号,内容均可自定义。 完全是出于娱乐来开发者玩玩------下图codeooo便是该app:  接下来我们看下界面:   伪装发送短信,并通知栏通知: 写一个线程直接跳到sms并进行插入:

    2024年02月16日
    浏览(30)
  • (短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码

    阿里云官网: https://www.aliyun.com/ 点击官网首页注册按钮。 注册成功后,点击登录按钮进行登录。登录后进入短信服务管理页面,选择国内消息菜单: 短信签名是短信发送者的署名,表示发送方的身份。 切换到【模板管理】标签页: 短信模板包含短信发送内容、场景、变量信息

    2024年02月02日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包