Android使用腾讯qcloundsms实现发送短信功能

时间:2024-03-18 13:50:58

本文主要讲一下如何使用腾讯与提供的短信平台发送验证码或者文本短信,注:腾讯云是需要付费的,(当然不是说我土豪买腾讯的产品,只是手头有个可以使用平台的机会)免费的短信平台可以使用:Mob(官方网站:mob官网)提供的SMSSDK。

1.注册腾讯云账号

cloud.tencent.com腾讯云,自己注册账号的流程就跳过了,这个很简单,只是需要进行一些认证和信息绑定。

2.添加短信平台应用

按照腾讯的要求,需要添加一个应用后会得到一个SDK APPID和APPkey,这两个码很重要,是后面程序里向腾讯云发起请求的登录名和密码。

Android使用腾讯qcloundsms实现发送短信功能

3.创建短信签名

在上一步创建的应用里,创建一个短信的签名,这个签名将会作为发送短信标签。

4.创建短信模板

按照腾讯创建模板的要求,创建一个短信模板。模板示例:{1}为您的登录验证码,请于{2}分钟内填写。如非本人操作,请忽略本短信。 (其中{数字}为可自定义的内容,须从1开始连续编号,如{1}、{2}等)

5.下载Java SDK

Android使用腾讯qcloundsms实现发送短信功能


在应用页面的最下方有下载SDK的链接,进去选择Java SDK下载,同时阅读SDK配置方法,我这里选择的是吧JAR包导入工程中,需要下载这四个JAR包,复制到Android工程下的F:\Code\Android\Github\plant\app\libs(这是我的路径,实际需要换成自己的工程)

Android使用腾讯qcloundsms实现发送短信功能

6.配置参数

打开app目录下的build.gradle文件,在android{ }中添加

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
    }

    repositories{
        flatDir{
        dirs 'libs'
        }

}

在AndroidManifest.xml文件中添加,访问网络、有关GSM网络信息的权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
7.编写发送短信的代码

这里要说明一下,在运行程序时候可能遇到的两个坑,的确是初学者容易犯的错误:

第一,META-INF/DEPENDENCIES文件加载重复,导致安卓模拟器转不起来,报错为
Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> More than one file was found with OS independent path 'META-INF/DEPENDENCIES'

解决办法如下:
packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
    }
第二,在AndroidManifest.xml中配置网络权限
<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

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

第三,在UI线程中操作数据,报错
Error:NetworkSecurityConfig: No Network Security Config specified, using platform default
解决办法如下:
new Thread() {
            public void run() {
                try{
                    //初始化单发
                    SmsSingleSender singleSender = new SmsSingleSender(appid, appkey);
                    SmsSingleSenderResult singleSenderResult;

                    //指定模板单发
                    //{1}为您的登录验证码,请于{2}分钟内填写。如非本人操作,请忽略本短信。。
                    params = new ArrayList<String>();
                    params.add("1314");
                    params.add("1");
                    singleSenderResult = singleSender.sendWithParam("86", phoneNumber1, tmplId, params, "安卓SMS", "", "");
                    System.out.println(singleSenderResult);


                } catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        }.start();

MainActivity.java

package com.bing.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;

import java.util.ArrayList;
import java.util.Random;


public class MainActivity extends AppCompatActivity {

    private Button button1;
    private Button button2;
    private Random random = new Random();

    int appid = 1400023881; //此处是自己的应用id
    String appkey = "56dav17415c06994355293f0634411878";  //此处是自己申请的appkey

    String phoneNumber1 = "18522778888";
    String phoneNumber2 = "15122296666";
    String phoneNumber3 = "18602627890";
    String phoneNumber4 = "13920019999";

    //随机数数组
    private static final char[] CHARS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    int tmplId = 96804;
    int warningId = 97771;
    ArrayList<String> params1;
    ArrayList<String> params2;

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


        button1 = (Button) findViewById(R.id.sender_verification_code);
        button2 = (Button) findViewById(R.id.sender_warning);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                senderVerificationCode();
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                senderWarning();
            }
        });
    }
    private void senderVerificationCode (){
        new Thread() {
            public void run() {
                try{

                    //初始化单发
                    SmsSingleSender singleSender = new SmsSingleSender(appid, appkey);
                    SmsSingleSenderResult singleSenderResult;

                    //指定模板单发
                    //{1}为您的登录验证码,请于{2}分钟内填写。如非本人操作,请忽略本短信。。

                    params1 = new ArrayList<String>();
                    params1.add(createCode());
                    params1.add("1");
                    singleSenderResult = singleSender.sendWithParam("86", phoneNumber1, tmplId, params1, "德发科技", "", "");
                    System.out.println(singleSenderResult);

                } catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        }.start();
    }
    private void senderWarning (){
        new Thread() {
            public void run() {
                try{

                    //初始化单发
                    SmsSingleSender singleSender = new SmsSingleSender(appid, appkey);
                    SmsSingleSenderResult singleSenderResult;

                    //指定模板单发
                    //您的{1}号温室,{2}{3}!请到现场查看设备是否异常或通知现场人员,持续时间为{4}
                    params2 = new ArrayList<String>();
                    params2.add("2");
                    params2.add("温度为");
                    params2.add("41");
                    params2.add("5分钟");
                    singleSenderResult = singleSender.sendWithParam("86", phoneNumber3, warningId, params2, "安卓", "", "");
                    System.out.println(singleSenderResult);

                } catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        }.start();
    }

    //生产验证码
    private String createCode() {
        StringBuilder buffer = new StringBuilder();
        for (int i = 0; i < 6; i++) {
            buffer.append(CHARS[random.nextInt(CHARS.length)]);
        }
        return buffer.toString();
    }
}
简单写个布局文件:
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.libing.myapplication.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/sender_verification_code"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="SEND"
            android:layout_marginLeft="50dp"
            android:layout_marginTop="50dp"
            />
        <Button
            android:id="@+id/sender_warning"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Warning"
            android:layout_marginTop="50dp"
            android:layout_marginLeft="70dp"
            />

    </LinearLayout>


</android.support.constraint.ConstraintLayout>
8.总结

整个过程很简单,参考着腾讯给的操作说明,只是需要注意一些细节和报错后怎么处理。