使用Twilio和Android发送短信

时间:2017-12-20 13:26:54

标签: android kotlin twilio ngrok

我有Android项目。我用Gradle和Kotlin 我需要用Twilio实现SMS发送机制。

我使用了本手册: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

输出如下链接:

enter image description here

现在我转到我的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代码。现在我的应用程序不能在模拟器或真实设备上运行

1 个答案:

答案 0 :(得分:0)

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

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

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

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

以下是Local Functions

的参考资料