使用Twilio和Android发送短信

问题描述 投票:0回答:1

我有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

并输出以下链接:

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

android kotlin twilio ngrok
1个回答
0
投票

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

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

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

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

这是一个参考:Local Functions

© www.soinside.com 2019 - 2024. All rights reserved.