2015-01-23 18 views
8

Nella mia applicazione Android ho creato un pulsante, quando ho premuto il pulsante Voglio inviare un messaggio. Quindi per quello ho creato una classe java e scritto codice twilio.Come inviare SMS utilizzando Twilio nella mia applicazione Android?

final TwilioRestClient client = new TwilioRestClient(
         ACCOUNT_SID, AUTH_TOKEN); 

       // Get the main account (The one we used to authenticate the 
       // client) 
       final Account mainAccount = client.getAccount(); 

       final SmsFactory messageFactory = mainAccount.getSmsFactory(); 
       final Map<String, String> messageParams = new HashMap<String, String>(); 
       messageParams.put("To", "+912342423423"); 
       messageParams.put("From", "+132432432434"); 
       messageParams.put("Body", "This is my message"); 
       try { 
        messageFactory.create(messageParams); 
       } catch (TwilioRestException e) { 
        e.printStackTrace(); 
       } 

quando sto usando il codice di cui sopra è che mostra un po 'di errore come java.lang.NoSuchMethodError: org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager

ho aggiunto solo un unico file jar nella cartella lib come " twilio-java-sdk-3.3.10-jar-with-dependencies.jar ".

prego di dirmi cosa posso fare?

risposta

7

ho usato HttpPost metodo per send sms in che ho superato il mio url con l'autenticazione di base Ecco il mio codice

HttpClient httpclient = new DefaultHttpClient(); 

HttpPost httppost = new HttpPost(
          "https://api.twilio.com/2010-04-01/Accounts/{ACCOUNT_SID}/SMS/Messages"); 
     String base64EncodedCredentials = "Basic " 
          + Base64.encodeToString(
            (ACCOUNT_SID + ":" + AUTH_TOKEN).getBytes(), 
            Base64.NO_WRAP); 

        httppost.setHeader("Authorization", 
          base64EncodedCredentials); 
        try { 

         List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
         nameValuePairs.add(new BasicNameValuePair("From", 
           "+123424353534")); 
         nameValuePairs.add(new BasicNameValuePair("To", 
           "+914342423434")); 
         nameValuePairs.add(new BasicNameValuePair("Body", 
           "Welcome to Twilio")); 

         httppost.setEntity(new UrlEncodedFormEntity(
           nameValuePairs)); 

         // Execute HTTP Post Request 
         HttpResponse response = httpclient.execute(httppost); 
         HttpEntity entity = response.getEntity(); 
         System.out.println("Entity post is: " 
           + EntityUtils.toString(entity)); 


        } catch (ClientProtocolException e) { 

        } catch (IOException e) { 

        } 
       } 

Si sta lavorando bene.

+0

Ho usato il codice per inviare SMS nel mio numero, ma la risposta è sempre così " +15005550006 inviati dal tuo account di prova Twilio - Benvenuti Twilio coda outbound-api 2010-04-01 USD "Ma non ho ricevuto l'SMS. Per favore, perché questo accada? Sto usando le credenziali di test. – Hits

+0

sì lo stato è in coda, quindi verrà dopo un po ', quando sto testando la mia app anche in quel momento, ho avuto la stessa risposta. – Hanuman

+0

con carattere non valido a "https://api.twilio.com/2010-04-01/Accounts/{my-_ACCOUNT_SID}/SMS/Messages"); linea? – Sam

0

Twilio Java SDK ha dipendenze di terze parti senza di esse non funzionerà. Le dipendenze sono: 1. Httpcore 2. HttpClient 3. Commons Lang 4. JSON semplice 5. Jackson Non del tutto sicuro se ne avete bisogno, ma almeno ora non trovi il httpcore

+0

Se ho aggiunto i file "httpcore o HttpClient jar" allora sta mostrando l'errore è "file DEX più definiscono Lorg/apache/http/ConnectionClosedException;" significa che le stesse classi o gli stessi pacchetti sono disponibili nel file jar di twilio-sdk-java. Quindi è possibile visualizzare classi duplicate – Hanuman

+0

Il jar twilio-sdk-java non ha questa classe, la classe che hai menzionato solo disponibile in httpcore. jar, quindi forse hai più versioni di httpcore disponibili? – Babl

+0

Ho aggiunto quei file jar come "twilio-java-sdk-3.3.10.jar, httpcore.jar, httpclient-4.3.jar" e la classe "org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager" presente in httpclient-4.3.jar ma mostra lo stesso errore che Log-cat sta visualizzando in questo modo – Hanuman

0

Si dovrebbe utilizzare il progetto BasicPhone di Twilio SDK. Ho provato questo per chiamare e ora posso chiamare anche io. Questo progetto ha tutti i metodi e le funzioni che è necessario chiamare e inviare SMS. Prima di tutto, hai bisogno di un servizio web PHP per ottenere token di funzionalità e passare lo script PHP nella tua app.

4

questa soluzione con Retrofit

public static final String ACCOUNT_SID = "accountSId"; 
public static final String AUTH_TOKEN = "authToken"; 

private void sendMessage() { 
    String body = "Hello test"; 
    String from = "+..."; 
    String to = "+..."; 

    String base64EncodedCredentials = "Basic " + Base64.encodeToString(
      (ACCOUNT_SID + ":" + AUTH_TOKEN).getBytes(), Base64.NO_WRAP 
    ); 

    Map<String, String> data = new HashMap<>(); 
    data.put("From", from); 
    data.put("To", to); 
    data.put("Body", body); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("https://api.twilio.com/2010-04-01/") 
      .build(); 
    TwilioApi api = retrofit.create(TwilioApi.class); 

    api.sendMessage(ACCOUNT_SID, base64EncodedCredentials, data).enqueue(new Callback<ResponseBody>() { 
     @Override 
     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
      if (response.isSuccessful()) Log.d("TAG", "onResponse->success"); 
      else Log.d("TAG", "onResponse->failure"); 
     } 

     @Override 
     public void onFailure(Call<ResponseBody> call, Throwable t) { 
      Log.d("TAG", "onFailure"); 
     } 
    }); 
} 

interface TwilioApi { 
    @FormUrlEncoded 
    @POST("Accounts/{ACCOUNT_SID}/SMS/Messages") 
    Call<ResponseBody> sendMessage(
      @Path("ACCOUNT_SID") String accountSId, 
      @Header("Authorization") String signature, 
      @FieldMap Map<String, String> metadata 
    ); 
} 

dipendenze per build.gradle
compile 'com.squareup.retrofit2:retrofit:2.1.0'

+0

ResponseBody all'interno del nuovo Callback () che fornisce l'errore – Sam

+0

L'URL dell'API non desidera più la parte/SMS del percorso. Puoi tagliare quella parte, come visto qui: https://www.twilio.com/console/dev-tools/api-explorer/sms/messages/create –

3

Il mio metodo, utilizzando OkHttp:

1. Prerequisiti

Gradle:

dependencies {  
    compile 'com.squareup.okhttp3:okhttp:3.4.1' 
} 

manifesto:

<uses-permission android:name="android.permission.INTERNET"/> 

autorizzazione in attività:

if (android.os.Build.VERSION.SDK_INT > 9) { 
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build()); 
} 

2. Codice

private void sendSms(String toPhoneNumber, String message){ 
    OkHttpClient client = new OkHttpClient(); 
    String url = "https://api.twilio.com/2010-04-01/Accounts/"+ACCOUNT_SID+"/SMS/Messages"; 
    String base64EncodedCredentials = "Basic " + Base64.encodeToString((ACCOUNT_SID + ":" + AUTH_TOKEN).getBytes(), Base64.NO_WRAP); 

    RequestBody body = new FormBody.Builder() 
      .add("From", fromPhoneNumber) 
      .add("To", toPhoneNumber) 
      .add("Body", message) 
      .build(); 

    Request request = new Request.Builder() 
      .url(url) 
      .post(body) 
      .header("Authorization", base64EncodedCredentials) 
      .build(); 
    try { 
     Response response = client.newCall(request).execute(); 
     Log.d(TAG, "sendSms: "+ response.body().string()); 
    } catch (IOException e) { e.printStackTrace(); } 

} 

ho usato Allu cod e per autorizzazione generativa nell'intestazione

0

Ecco come ho risolto il mio bisogno. public class TwilioAsyncTask estende AsyncTask {

 Context context; 
     ProgressDialog progressDialog; 


     public TwilioAsyncTask(Context context) { 
      this.context = context; 
     } 

     @Override 
     protected String doInBackground(String... strings) { 

      // 
      HttpClient httpclient = new DefaultHttpClient(); 

      HttpPost httppost = new HttpPost(
        "https://api.twilio.com/2010-04-01/Accounts/AC_yourACCOUNT_SID_9b/SMS/Messages"); 
      String base64EncodedCredentials = "Basic " 
        + Base64.encodeToString(
        (ACCOUNT_SID + ":" + AUTH_TOKEN).getBytes(), 
        Base64.NO_WRAP); 

      httppost.setHeader("Authorization", 
        base64EncodedCredentials); 
      try { 

       int randomPIN = (int) (Math.random() * 9000) + 1000; 
       String randomVeriValue = "" + randomPIN; 
// these are for control in other anctivity used sharepreference 
       editorTwilio.putString("twilio_veri_no", randomVeriValue); 
       editorTwilio.commit(); 

       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       nameValuePairs.add(new BasicNameValuePair("From", 
         "+148******")); // what number they gave you 
       nameValuePairs.add(new BasicNameValuePair("To", 
         "+90" + phoneNo)); // your phone or our customers 
       nameValuePairs.add(new BasicNameValuePair("Body", 
         "Your verification number is : " + randomVeriValue)); 

       httppost.setEntity(new UrlEncodedFormEntity(
         nameValuePairs)); 

       // Execute HTTP Post Request 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       System.out.println("Entity post is: " 
         + EntityUtils.toString(entity)); 
       // Util.showMessage(mParentAct, "Welcome"); 


      } catch (ClientProtocolException e) { 

      } catch (IOException e) { 

      } 

      // 
      return "Executed"; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      // execution of result of Long time consuming operation 
      //progressDialog.dismiss(); 
     } 


     @Override 
     protected void onPreExecute() { 

      progressDialog = ProgressDialog.show(context, "", " Wait for "); 

     } 


     @Override 
     protected void onProgressUpdate(String... text) { 
      // Things to be done while execution of long running operation is in 
      // progress. For example updating ProgessDialog 
     } 

    } 


    And call your Task 


TwilioAsyncTask task = new TwilioAsyncTask(CountryAndPhone.this); 
         task.execute();