2017-10-20 13 views
0

사용자가 locationsqlitedatabase에 저장된 전화 번호로 보낼 수있는 응용 프로그램을 작성하려고합니다. 나는 사용자가 location을 하나의 전화 번호로 문자 메시지로 전송할 수있는 응용 프로그램을 테스트했으며 작동했지만 지금은 list 숫자를 만들고 sendTextMessage 메서드의 매개 변수로 전달하려고 시도하면 location을 텍스트로 사용합니다 메시지가 전송되지 않습니다. 지금까지 아래에 주어진 코드,숫자 목록에 문자 메시지가 전송되지 않고 하나의 번호 만 지정되었을 때 전송됩니다

코드

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

난 그냥 하나 개의 전화 번호로 응용 프로그램을 테스트하려고 할 때 주석 처리 된 줄은 것들을 시도했습니다. 또한, 처음에는 sqlitedatabase에 하나의 전화 번호가 있다고 가정하고, 많은 경우에 arraylist 크기가 증가하는 location_button을 여러 번 클릭한다고 가정합니다. 예를 들어, 처음에 arraylist[xxxxxx] 요소가 있고 다음에 location_button을 클릭하면 arraylist은 이제 [xxxxxx,xxxxxx]이됩니다.

누구든지이 문제를 해결할 수 있습니까?

+0

'SmsManager' 메서드는 한 번에 하나의 숫자 만 처리합니다. 하나씩 보내야합니다. –

+0

동시에 여러 번호로 SMS를 보낼 수있는 방법이 없습니까? –

+1

루프를 사용하여 보낼 수 있습니까? –

답변

0

sendTextMessage() 메서드는 한 번에 하나의 숫자 만 사용할 수 있으므로 목록의 각 숫자에 대해이 메서드를 실행해야합니다.

그 말을하는 동안 그걸을 통해 '반복'해야한다고합니다. 이처럼 :

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

무엇 기본적으로 말하는 것은 :

"알려줘야, sendTextMessage는 번호 하나의가 숫자 하나를 보자 내가 수행하고 때까지이 일을 계속 할 것이다."

+0

Thnaks for the help –