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