使用 Twilio 和 Android 发送短信

Posted

技术标签:

【中文标题】使用 Twilio 和 Android 发送短信【英文标题】:SMS sending with Twilio and Android 【发布时间】:2018-06-03 01:51:39 【问题描述】:

我有 android 项目。我使用 Gradle 和 Kotlin。 我需要用 Twilio 实现短信发送机制。

我用过这本手册:How to Send an SMS from Android

所以,我创建了后端。 这是后端的build.gradle

group 'com.my.app'
version '1.0-SNAPSHOT'

buildscript 
    repositories  jcenter() 
    dependencies 
        classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3'
    


apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'

sourceCompatibility = 1.8
mainClassName = 'SMSBackend'

repositories 
    mavenCentral()


dependencies 
    testImplementation group: 'junit', name: 'junit', version: '4.12'
    implementation 'com.sparkjava:spark-core:2.6.0'
    implementation group: 'com.twilio.sdk', name: 'twilio', version: '7.9.0'
    implementation 'org.slf4j:slf4j-simple:1.6.1'

这是主要活动 - SMSBackend.java

import com.twilio.http.TwilioRestClient;
import com.twilio.rest.api.v2010.account.Message;
import com.twilio.rest.api.v2010.account.MessageCreator;
import com.twilio.type.PhoneNumber;
import static spark.Spark.*;

import static spark.Spark.get;
import static spark.Spark.post;

public class SMSBackend 
    public static void main(String[] args) 
        get("/", (req, res) -> "Hello, World!");

        TwilioRestClient client = new TwilioRestClient.Builder(System.getenv("AC749....d462247b104a"), System.getenv("096e4788......ed95cc36c")).build();

    post("/sms", (req, res) -> 
        String body = req.queryParams("Body");
        String to = req.queryParams("To");
        String from = "+15037381694";

        Message message = new MessageCreator(
                new PhoneNumber(to),
                new PhoneNumber(from),
                body).create(client);

        return message.getSid();
    );
    

在那之后,我使用ngrok 来让这个应用在外部可用。

我输入命令:

ngrok http 4567

并有如下链接的输出:

现在我转到我的 Android 应用程序。我需要输入我的电话号码,点击按钮,然后接收短信。 为此,我将ngrok 的链接放入我的活动中。

我的MyActivity.kt

package com.my.app

import android.content.Context
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast

import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

class MyActivity : AppCompatActivity() 

private val mClient = OkHttpClient()
private val mContext = getApplicationContext()
private val message = resources.getString(R.string.textSMS)
private val userPhoneNumber = findViewById(R.id.editText) as EditText
private val buttonSend = findViewById(R.id.button) as Button

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my)

        buttonSend.setOnClickListener 
            post(("https://2b722554.ngrok.io/sms"), object : Callback 
                        override fun onFailure(call: Call, e: IOException) 
                            e.printStackTrace()
                        

                        @Throws(IOException::class)
                        override fun onResponse(call: Call, response: Response) 
                            runOnUiThread(object : Runnable 
                                public override fun run() 
                                    userPhoneNumber.setText("")
                                    message.setText("")
                                    Toast.makeText(applicationContext, "SMS Sent!", Toast.LENGTH_SHORT).show()
                                
                            )
                        

            )
    



@Throws(IOException::class)
    internal fun post(url: String, callback: Callback): Call 
        val formBody = FormBody.Builder()
                .add("To", userPhoneNumber.getText().toString())
                .add("Body", message.getText().toString())
                .build()
             val request = Request.Builder()
                .url(url)
                .post(formBody)
                .build()
    val response = mClient.newCall(request)
    response.enqueue(callback)
    return response

所以,当我在模拟器或真实设备上运行我的应用程序时,我可以输入数字,但按钮不起作用。 但我可以从 Twilio 网站发送和接收短信,所以,我的 Twilio 号码没问题。

我错过了什么?

UPD。我已经更改了我所有的 kotline 代码。现在我的应用程序无法在模拟器或真实设备上运行

【问题讨论】:

你在哪里调用 sendSMS() 函数? 【参考方案1】:

查看您添加到button 的点击监听器:

buttonSend.setOnClickListener 
  fun onClick(v: View) 
    ...
  

这只会创建一个名为onClick 的本地函数,但不会在点击侦听器中执行任何代码。要使其工作,您需要删除所有本地函数声明并在点击侦听器正文中执行请求:

buttonSend.setOnClickListener 
  post(getString("https://07eca790.ngrok.io/sms") ...

这是一个参考:Local Functions

【讨论】:

谢谢!我想。我已经删除了本地函数并更新了帖子中的代码。但是现在postcatche 是红色的并且出现了问题:“未解决的参考”。这是什么意思? 嗯,这些是编译器错误。重新检查您的代码是否正确以及您调用的函数是否存在。 好吧,我已经清理了我的代码。我现在只有一个编译错误:post(mContext.getString("https://54c5ffb1.ngrok.io/sms") 我可以看到链接带有下划线注释:“类型不匹配:推断类型是字符串,但预期为 Int”。 您不需要mContext.getString 部分,只需将URL 传递给post() 即可 现在我使用post(("https://2b722554.ngrok.io/sms")。此错误已消失,但现在我的应用程序无法在模拟器或真实设备上运行。我已经把我所有的新代码都放在帖子里了,你能看一下吗?

以上是关于使用 Twilio 和 Android 发送短信的主要内容,如果未能解决你的问题,请参考以下文章

向手机发送短信的python源代码,该怎么解决

使用 FCM 和 Twilio 发送短信

python发短信

如何批量重发失败的短信

Python: 利用Twilio给自己手机发送短信

php 使用Twilio API发送短信通知