Отправка SMS с помощью Twilio и Android

У меня есть проект Android. Я использую Gradle и Kotlin.
Мне нужно реализовать механизм отправки SMS с Twilio.

Я использовал это руководство: как отправить SMS с Android

Итак, я создал Backend.
Вот build.gradle для Backend:

 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-приложению. Мне нужно ввести свой номер телефона, нажать на кнопку и после этого получить SMS.
Для этого я поместил ссылку из 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 } 

Поэтому, когда я запускаю свое приложение на эмуляторе или на реальном устройстве, я могу ввести номер, но кнопка не работает.
Но я могу отправить и получить SMS с сайта Twilio, поэтому мой номер Twilio – это хорошо.

Что мне не хватает?

UPD . Я изменил весь код котлинга. Теперь мое приложение не запускается на эмуляторе или реальном устройстве

    Глядя на прослушиватель кликов, вы добавляете к button :

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

    это создаст локальную функцию, называемую onClick но не будет выполнять код внутри прослушивателя кликов. Чтобы это сработало, вам нужно удалить все объявления локальных функций и выполнить запрос прямо в теле слушателя кликов:

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

    Вот ссылка: Локальные функции