2017-10-20 14 views
0

Je suis en train de construire une application dans laquelle l'utilisateur peut envoyer son location aux numéros de téléphone enregistrés dans un sqlitedatabase. J'ai testé l'application où l'utilisateur peut envoyer le location comme un message texte à un seul numéro de téléphone et cela a fonctionné mais maintenant quand j'essaye de créer un list des nombres et de le passer comme un paramètre dans sendTextMessage la méthode de smsManager le comme texte le message n'est pas envoyé. Je l'ai essayé le code ci-dessous jusqu'à présent,Message texte n'est pas envoyé à une liste de nombres mais est envoyé quand un seul numéro est spécifié

code

public class Gps4Activity extends AppCompatActivity implements 
     GoogleApiClient.OnConnectionFailedListener { 

    private static final String LOG_TAG = "PlacesAPIActivity"; 
    private static final int GOOGLE_API_CLIENT_ID = 0; 
    private GoogleApiClient mGoogleApiClient; 
    private static final int PERMISSION_REQUEST_CODE = 100; 
    private static final int MY_PERMISSIONS_REQUEST_SEND_SMS =0 ; 
    private TextView display; 
    private Button location_button,contacts_button; 
    //String number="xxxxxxxxxx"; 
    ArrayList<String> numbers; 
    SQLiteDatabase db; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_gps4); 
     numbers=new ArrayList<>(); 
     db = new UserDatabase(this).getReadableDatabase(); 
     location_button=(Button)findViewById(R.id.show_button); 
     contacts_button=(Button)findViewById(R.id.view_button); 
     display=(TextView)findViewById(R.id.location_textview); 

     mGoogleApiClient = new GoogleApiClient.Builder(Gps4Activity.this) 
       .addApi(Places.PLACE_DETECTION_API) 
       .enableAutoManage(this, GOOGLE_API_CLIENT_ID, this) 
       .build(); 

     location_button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (mGoogleApiClient.isConnected()) { 
        if (ActivityCompat.checkSelfPermission(Gps4Activity.this, 
          android.Manifest.permission.ACCESS_FINE_LOCATION) 
          != PackageManager.PERMISSION_GRANTED) { 
         ActivityCompat.requestPermissions(Gps4Activity.this, 
           new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
           PERMISSION_REQUEST_CODE); 
         ActivityCompat.requestPermissions(Gps4Activity.this, 
           new String[]{Manifest.permission.SEND_SMS}, 
           MY_PERMISSIONS_REQUEST_SEND_SMS); 
        } 
       } 
       callPlaceDetectionApi(); 
      } 
     }); 

     contacts_button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent=new Intent(Gps4Activity.this,DetailsActivity.class); 
       startActivity(intent); 
      } 
     }); 
    } 

    public ArrayList<String> getContacts(){ 

     Cursor cursor=db.rawQuery("SELECT * FROM "+UserDatabase.TABLE_NAME,null); 
     while (cursor.moveToNext()){ 
      String contact=cursor.getString(cursor.getColumnIndex(UserDatabase.NUMBER)); 
      numbers.add(contact); 
     } 
     return numbers; 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
     Log.e(LOG_TAG, "Google Places API connection failed with error code: " 
       + connectionResult.getErrorCode()); 

     Toast.makeText(this, 
       "Google Places API connection failed with error code:" + 
         connectionResult.getErrorCode(), 
       Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, 
              String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case PERMISSION_REQUEST_CODE: 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        callPlaceDetectionApi(); 
       } else { 
        Toast.makeText(getApplicationContext(), 
          "SMS faild, please try again.", Toast.LENGTH_LONG).show(); 
        return; 
       } 
       break; 

     } 
    } 

    private void callPlaceDetectionApi() throws SecurityException { 
     PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi 
       .getCurrentPlace(mGoogleApiClient, null); 
     result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() { 
      @Override 
      public void onResult(PlaceLikelihoodBuffer likelyPlaces) { 
       for (PlaceLikelihood placeLikelihood : likelyPlaces) { 
        Log.i(LOG_TAG, String.format("Place '%s' with " + 
            "likelihood: %g", 
          placeLikelihood.getPlace().getName(), 
          placeLikelihood.getLikelihood())); 
        display.setText(placeLikelihood.getPlace().getAddress().toString()); 
        messageSending(placeLikelihood.getPlace().getAddress().toString()); 
        break; 
       } 
       likelyPlaces.release(); 

      } 
     }); 
    } 

    public void messageSending(String message){ 
     SmsManager smsManager = SmsManager.getDefault(); 
//  smsManager.sendTextMessage(number, null, message, null, null); 
     getContacts(); 
     smsManager.sendTextMessage(String.valueOf(numbers),null,message,null,null); 
     Toast.makeText(getApplicationContext(), "SMS sent."+String.valueOf(numbers), 
       Toast.LENGTH_LONG).show(); 
    } 
} 

Les lignes sont commentées celles où j'ai essayé de tester l'application avec un seul numéro de téléphone. En outre, supposons initialement il n'y a qu'un seul numéro de téléphone dans sqlitedatabase, autant de fois que je clique sur le location_button que plusieurs fois le arraylist augmente sa taille. Par exemple, initialement si le arraylist a des éléments [xxxxxx] la prochaine fois que je clique sur le location_button, le arraylist va maintenant avoir [xxxxxx,xxxxxx].

Quelqu'un peut-il m'aider à résoudre ce problème?

+0

Les méthodes 'SmsManager' ne traitent qu'un nombre à la fois. Vous devrez les envoyer un par un. –

+0

N'existe-t-il pas un moyen d'envoyer des SMS à plusieurs numéros en même temps? –

+1

Vous pouvez les envoyer avec une boucle? –

Répondre

0

Étant donné que la méthode sendTextMessage() ne peut prendre qu'un seul numéro à la fois, vous devez exécuter cette méthode pour chaque numéro de la liste. Cela étant dit, vous devriez «boucler» à travers cette List. Comme ceci:

for (String number : numbers) { 
    smsManager.sendTextMessage(numbers, null, message, null, null); 
} 

Ce qu'il revient à dire est:

« Allright, nous allons prendre le numéro un, sendTextMessage numéro un, et je vais continuer à le faire jusqu'à ce que je suis fait. »

+0

Thnaks pour l'aide –