2017-12-20 23 views
0

私はAndroidプロジェクトを持っています。私はGradleとKotlinを使用します。
TwilioでSMS送信メカニズムを実現する必要があります。私はこのマニュアルを使用TwilioとAndroidで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アプリケーションにアクセスしてください。電話番号を入力し、ボタンをクリックしてから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 
} 

私はエミュレータまたは実際のデバイス上で自分のアプリケーションを実行すると、私は番号を入力することができますが、ボタンが機能していません。
しかし、TwilioサイトからSMSを送受信できるので、Twilio番号はOkです。

私には何が欠けていますか?

UPD。私はすべてのコットラインコードを変更しました。今、私のアプリケーションは、あなたがbuttonに追加]をクリックしますリスナを見るとエミュレータまたは実際のデバイス

+0

はどこsendSMS()関数を呼び出していますか? –

答えて

0

上では実行されません:

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

はこれが唯一のonClickと呼ばれるローカル関数を作成しますが、それは実行されませんクリックリスナー内のコード。この作業を取得するには、すべてのローカル関数の宣言を削除して、右クリックリスナー本体にリクエストを実行する必要があります。

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

はここに参照です:Local Functions

+0

ありがとう!私はしようとしています。私はローカル関数を削除し、ポストのコードを更新しました。しかし今、 'post''、' catch''、 'e'という言葉は赤で、「未解決の参照」という問題があります。どういう意味ですか? – NaSt

+0

これはコンパイルエラーです。コードが正しいことと、呼び出し元の関数が存在することを再確認してください。 – Egor

+0

まあ、私は自分のコードをきれいにしました。私は今コンパイルエラーが1つしかありません: 'post(mContext.getString(" https://54c5ffb1.ngrok。io/sms ")'リンクには「タイプの不一致:推測されたタイプは文字列ですが、Intが期待されています」というコメントが下線付きで表示されていることがわかります。 – NaSt

関連する問題