【问题标题】:Twilio sending texts on android problemsTwilio 发送有关 android 问题的文本
【发布时间】:2018-05-17 08:55:59
【问题描述】:

我正在为需要发送短信的学校创建一个 Android 应用程序。我已经有几个人推荐了 twilio,所以我决定接受它。遵循本教程:https://www.twilio.com/blog/2016/05/how-to-send-an-sms-from-android.html,使用我自己的 android 应用程序,其中包括我在调用 post 时收到 404(通过 ngrok 看到)。我完全不知所措,对android还是很陌生。后端通过 intellij 给出以下消息: 8810 [qtp649044888-15] INFO spark.http.matching.MatcherFilter - 请求的路由 [/] 尚未在 Spark 中映射为接受:[null]

帐户 ID、地址、电话号码等替换为 x 后端:

//Heroku assigns different port each time, hence reading it from process.
        ProcessBuilder process = new ProcessBuilder();
        Integer port;
        if (process.environment().get("PORT") != null) {
            port = Integer.parseInt(process.environment().get("PORT"));
        } else {
            port = 4567;
        }
        Spark.port(port);


        get("/", (req, res) -> "Hello, World");

        TwilioRestClient client = new TwilioRestClient.Builder(System.getenv("ACxxxxxxx72279fb226f0dd162c869ce1e"), System.getenv("xxxxxxxc324a89155b93b5af26393297")).build();

        post("/sms", (req, res) -> {
            String body = req.queryParams("Body");
            String to = req.queryParams("To");
            String from = System.getenv("216450xxxx");

            Message message = new MessageCreator(
                    new PhoneNumber(to),
                    new PhoneNumber(from),
                    body).create(client);

            return message.getSid();
        });

App-post 方法

Call post(String url, Callback callback) throws IOException {
        RequestBody formBody = new FormBody.Builder().add("To", "609420xxxx").add("Body", "TEST").build();
        Request request = new Request.Builder().url(url).post(formBody).build();
        Call response = mClient.newCall(request);
        response.enqueue(callback);
        Log.d("CALL: ", response.toString()+ "     " + callback.toString());
        return response;
    }

按钮上的应用发布方法:

emailButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    post("http://xxxxxxxx.ngrok.io", new  Callback(){
                        @Override
                        public void onFailure(Call call, IOException e) {
                            e.printStackTrace();
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(getApplicationContext(),"SMS Sent!",Toast.LENGTH_SHORT).show();
                                }
                            });
                        }

                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        });

这应该是向我的号码发送文本(在 twilio 帐户上验证),但我什么也没收到。吐司确实显示文本已发送。

【问题讨论】:

    标签: android text twilio clover twilio-functions


    【解决方案1】:

    查看火花source code for MatcherFilter,当未设置正文时,会引发对您遇到的错误的唯一引用

    if (body.notSet()) {
        LOG.info("The requested route [{}] has not been mapped in Spark for {}: [{}]",
                 uri, ACCEPT_TYPE_REQUEST_MIME_HEADER, acceptType);
    

    查看您链接到的Twilio tutorial(假设您提供的代码正是您正在使用的),您似乎已经更改了代码以将您的变量硬编码到类和方法中。

    我对 Android 编码了解不多,但我可以告诉你,教程中的这一行引用了项目中包含 Twilio 帐户 SID 的环境变量

    (System.getenv("TWILIO_ACCOUNT_SID")
    

    现在这是你的版本:

    (System.getenv("ACxxxxxxx72279fb226f0dd162c869ce1e")
    

    环境变量是设置一次的变量,通常在包含所有其他环境变量的文件中,并且特定于运行代码的用户或系统。这些允许开发人员轻松更改用户或系统特定变量值,即使他们在项目中多次引用这些变量。

    您正在尝试引用环境变量,但随后提供了您希望使用的值。这样不行。

    这是您在按钮方法上的应用帖子:

    post("http://xxxxxxxx.ngrok.io", new  Callback(){
    

    这是 Twilio 的:

    post(mContext.getString("YOUR_NGROK_URL/sms"), new  Callback(){
    

    您的硬编码网址删除了对 mContext 变量的引用,我不知道这是否重要,但您忽略的另一件事是您需要将 /sms 添加到您的网址末尾。

    我的建议是,鉴于您刚刚开始使用 Android,您现在应该严格按照教程进行操作。看起来您正在节省时间走捷径并在这里和那里改变一些地方,但是当它不起作用时,您没有经验来理解哪里出了问题。

    偷工减料、硬编码变量等无论如何都是一个坏习惯。我们都做过,后来我们都后悔了。正确学习、正确编码、添加 cmets 来解释您的代码,您将节省无数小时的未来挫败感。

    【讨论】:

    • 很好的答案!我建议最初的错误(路由/ 尚未映射)是由于ngrok URL 上缺少/sms。但是您也发现了下一个问题,即帐户详细信息失败。 ???
    • 非常感谢,是的,整个硬编码的事情是因为我们有一个严格的截止日期,只是为了让它工作而马虎。 /sms 是问题,新的 TwilioRestClient.Builder(System.getenv("ACxxxxxxx72279fb226f0dd162c869ce1e"), System.getenv("xxxxxxxc324a89155b93b5af26393297") 需要丢失 System.getenv。再次感谢,工作就像一个魅力。
    • 我很高兴听到它现在正在工作。您试图匆忙并节省几分钟的尝试最终导致您在出错时花费了 24 小时。我认为这是编程中最重要的课程之一,很高兴您在编码生涯的早期就学会了它!最后,最快的方法总是正确的方法,即使当时看起来并不像。祝你项目的其余部分好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多