2017-12-03 3 views
2

Zum ersten Mal Poster, tut mir leid, wenn etwas nicht richtig formatiert ist. Ich erstelle eine Android-App für die Schule, die Textnachrichten senden muss. Ich habe Twilio von mehreren Leuten empfohlen, also habe ich beschlossen, damit zu gehen. Nach diesem Tutorial: https://www.twilio.com/blog/2016/05/how-to-send-an-sms-from-android.html, mit meiner eigenen Android-App und die eine einschließlich Ich bekomme eine 404, wenn Post aufgerufen wird (durch Ngrok gesehen). Ich bin völlig verloren, noch neu für Android. Das Backend gibt die folgende Meldung durch intellij: 8810 [qtp649044888-15] INFO spark.http.matching.MatcherFilter - Die gewünschte Route [/] wurde in Funken nicht abgebildet für Accept: [null]Twilio sendet Texte auf Android-Probleme

Konto-IDs, Adressen, Telefonnummern usw. ersetzt mit Backend des 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-Methode

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; 
    } 

App post-Methode auf die Schaltfläche:

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(); 
       } 

      } 
     }); 

Dies sollte ein Text an meine Nummer senden (verifiziert auf Twilio-Konto), aber ich bekomme nichts. Der Toast erscheint und sagt, dass der Text gesendet wurde.

Vielen Dank im Voraus für jede und alle Hilfe.

Antwort

1

an der Funken Blick source code for MatcherFilter der einzige Hinweis auf den Fehler, den Sie geworfen bekommen, wenn der Körper nicht

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

Mit Blick auf die Twilio tutorial Sie verknüpft gesetzt (Ihr geliefert Code unter der Annahme, ist genau das, was du bist Sie haben den Code geändert, um Ihre Variablen in Klassen und Methoden zu codieren.

Ich weiß nicht viel über Android für die Codierung, aber ich kann Ihnen sagen, dass diese Zeile in den Tutorial eine Umgebungsvariable innerhalb des Projektes verweist mit dem Twilio Konto SID

(System.getenv("TWILIO_ACCOUNT_SID") 

Jetzt ist hier Ihre Version:

(System.getenv("ACxxxxxxx72279fb226f0dd162c869ce1e") 

eine Umgebungsvariable ist eine Variable, die einmal festgelegt ist, in der Regel in einer Datei, die alle anderen Umgebungsvariablen enthält, und ist spezifisch für den Benutzer oder das System der Code auf läuft. Damit können Entwickler benutzer- oder systemspezifische Variablenwerte leicht ändern, selbst wenn sie diese Variablen innerhalb eines Projekts mehrfach referenziert haben.

Sie versuchen, auf eine Umgebungsvariable zu verweisen, aber dann einen Wert anzugeben, den Sie verwenden möchten. So funktioniert es nicht.

Hier ist Ihre App Post auf Button-Methode:

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

Hier ist Twilio suchen:

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

Ihre hartcodierte URL fällt den Verweis auf die mContext Variable, ich weiß nicht, ob das wichtig ist, aber Die andere Sache, die Sie übersehen haben, ist, dass Sie /sms am Ende Ihrer URL hinzufügen müssen.

Meine Empfehlung, zu sehen, wie Sie gerade mit Android beginnen, wäre Tutorials für den Brief vorerst folgen. Es scheint so, als ob Sie Zeit sparen, indem Sie ein paar Ecken und Kanten abändern, aber wenn es nicht funktioniert, haben Sie nicht die Erfahrung, um zu verstehen, was falsch ist.

Kürzungen, harte Kodierung Variablen usw. ist eine schlechte Angewohnheit, um überhaupt zu kommen. Wir haben es alle geschafft, dann haben wir es alle später bereut. Lernen Sie richtig, programmieren Sie richtig, fügen Sie Kommentare hinzu, die Ihren Code erklären, und Sie werden sich unzählige Stunden der zukünftigen Frustration ersparen.

+1

Große Antwort! Ich würde vorschlagen, dass der anfängliche Fehler (dass die Route '/' nicht zugeordnet wurde) auf die fehlenden '/ sms' auf der ngrok-URL zurückzuführen ist. Aber Sie haben auch das nächste Problem bemerkt, nämlich dass die Kontodetails fehlgeschlagen sind. – philnash

+0

Vielen Dank, ja, die ganze Hardcoding-Sache war, weil wir eine strikte Deadline hatten und nur schlampig damit waren, es zum Laufen zu bringen. Die/sms war das Problem und neue TwilioRestClient.Builder (System.getenv ("ACxxxxxxx72279fb226f0dd162c869ce1e"), System.getenv ("xxxxxxxc324a89155b93b5af26393297") benötigt, um das System.getenv zu verlieren. Nochmals vielen Dank, funktioniert wie ein Charme. – lehmanj3

+0

I ' Ich bin erfreut, zu hören, dass es jetzt funktioniert. Dein Versuch, ein paar Minuten zu sparen und zu sparen, hat dich 24 Stunden gekostet, als es schief ging. Ich denke, das ist eine der wichtigsten Lektionen in der Programmierung, und es ist gut, dass du es so früh gelernt hast in deiner Programmierkarriere! Am Ende ist der schnellste Weg immer der richtige Weg, auch wenn es zu der Zeit nicht so scheint. Viel Glück mit dem Rest deines Projektes! – miknik