我有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代码。现在我的应用程序不能在模拟器或真实设备上运行
查看你添加到button
的点击监听器:
buttonSend.setOnClickListener {
fun onClick(v: View) {
...
}
}
这只会创建一个名为onClick
的本地函数,但它不会在click侦听器中执行任何代码。要使其工作,您需要删除所有本地函数声明并在单击侦听器正文中执行请求:
buttonSend.setOnClickListener {
post(getString("https://07eca790.ngrok.io/sms") ...
}
这是一个参考:Local Functions