2011-12-12 3 views
0

Android에서 SMS를 보내려는 경우 this 문서를 참조하고 있습니다.Android : 동기화 된 방식으로 SMS 보내기

루프를 구현하면서 10 개의 다른 숫자로 10 개의 문자를 보내려고했습니다. 예 : 루핑 이상 sendSMS(phoneNo, message); 하지만 6 sm을 보낸 후 sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); NullPointerExeption을 제공합니다. 내가 SMS의 전달에 대해 걱정하지 않는

참고로, 나는 deliveredPI에 null을 전달하고있다. 그러나 sms가 진짜로 보내지는지 알아내는 것은 아주 중요 하, 이것은 방송 수신기를 등록해서 검색 될 수있다.

나는 방송 수신기를 등록했지만, 전체 프로세스가 어떤 동기가없는 것처럼 보인다. 우리는 이전 SMS의 상태를받은 후에 만 ​​두 번째 SMS를 보내야합니다.

나는 SMS를 보내는 속도를 느리게하는 NullPointerExeption를 제거하는 데 도움이됩니다 가정입니다. 그리고 상태를 기다리는 것은 다른 SMS를 보내는 사이에 시간 차이를 유지하는 것이 가장 좋습니다. > 하나의 SMS를 보낼 - -> 상태 기다립니다 -> DB의 업데이트 상태 -> 다른 SMS를 보낼

은 즉, 내가 할 싶습니다.

답변

1

나는 개인적으로 게시하도록하겠습니다 코드를 테스트하지 않은,하지만 this other question에 대한 대답은 그래서 그것을 작동합니다 생각으로는 받아 들여졌다.

SmsManager smsMan = new SmsManager.getDefault(); 
    ArrayList<String> contactList = new ArrayList(); 
    //add contacts to contactList with contactList.add(string) 
    for (int i = 0; i <= contactList().size(); i++) { 
    String SENT = contactList.get(i).toString();// you could replace this with i, 
    //or something like "sms_sent_myappname" + i.toString()); 

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
      new Intent(SENT, 0); 

     //---when the SMS has been sent--- 
     registerReceiver(new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context arg0, Intent arg1) { 
       switch (getResultCode()) 
       { 
        case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS sent", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        Toast.makeText(getBaseContext(), "Generic failure", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        Toast.makeText(getBaseContext(), "No service", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        Toast.makeText(getBaseContext(), "Null PDU", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        Toast.makeText(getBaseContext(), "Radio off", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       } 
      } 
     }, new IntentFilter(SENT)); 
smsManager.sendTextMessage(contactList.get(i).toString(), null, message, sentPI, null); 
} 

위와 같은 방법으로 Android에 각 메시지를 차례로 보내 달라는 요청을 보내 게됩니다. 실제로 Activity.RESULT_OK 후 다음 SMS를 보낼 경우, 나는 ArrayList 방법을 사용하여 여전히 추천 할 것입니다, 대신 루프에 대한, 당신은 같은 것을 할 수 : 다시

public void onCreate(Bundle savedInstanceState) { 
smsMan = new SmsManager.getDefault(); //assuming you declared SmsManager smsMan in class body. 
contactList = new ArrayList(); //assuming you declared ArrayList<String> contactList in class body. 
//add contacts to contactList with contactList.add(string); 
} 
public void sendSms(int position){ 
    //add contacts to contactList with contactList.add(string) 
    String SENT = contactList.get(position).toString();// you could replace this with i, 
    //or something like "sms_sent_myappname" + i.toString()); 

     PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
       new Intent(SENT, 0); 

      //---when the SMS has been sent--- 
      registerReceiver(new BroadcastReceiver(){ 
       @Override 
       public void onReceive(Context arg0, Intent arg1) { 
        switch (getResultCode()) 
        { 
         case Activity.RESULT_OK 
         context.unregisterReceiver(this); 
         i++; 
         if (contactList.size()<i){ 
          sendSms(i); 
         } else { 
          //You are done sending - Do what you want. 
         } 
         break; 
        case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
         Toast.makeText(getBaseContext(), "Generic failure", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_NO_SERVICE: 
         Toast.makeText(getBaseContext(), "No service", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_NULL_PDU: 
         Toast.makeText(getBaseContext(), "Null PDU", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_RADIO_OFF: 
         Toast.makeText(getBaseContext(), "Radio off", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        } 
       } 
      }, new IntentFilter(SENT)); 
    smsManager.sendTextMessage(contactList.get(position).toString(), null, message, sentPI, null); 

} 

합니다. 나는 그것을 테스트하지 않았지만 효과가있다. 더 이상 질문이 있거나 내가 무엇에 대해 불분명한지 알려주십시오.

+0

코드가 재귀로 이어지고 있습니다. 그 효과에 대해 걱정하고 있습니다. 그러나 나는 그것을 구현하고 여기에 게시 할 경우 .. – Vikas

+0

@Vikas 미안 해요. 나는 처음 게시물에 코드를 엉망으로 만들었다. 이제 첫 번째 블록과 두 번째 블록을 모두 업데이트하여 코드가 필요한 방식을 구현했습니다. 나는 이것이 더 많은 도움이되기를 바랍니다. – Jakar

+0

감사합니다. 괜찮습니다. 첫 번째 게시물에 귀하의 요지가 있습니다. 내가 그 코드를했지만 비슷한 문제가., 6 SMS를 보낸 후, 내 서비스가 충돌 ... 나는 (여분의 코드를 제거하는) 새로운 프로젝트를 만들고, 당신이 그걸로 놀 수 있도록 당신에게 우편을 제공하려고 노력하고있어. – Vikas

0

실제로 댓글을 달 수 없기 때문에 답변으로 내 의견을 말하고 있습니다. 자카르, 제공하신 솔루션이 작동하지 않습니다. 어디서나 방송 수신기를 등록 취소하지는 않습니다. 코드에서 오류가 발생합니다.

0

답변을 찾은 것으로 가정합니다. 하지만 질문은 여전히 ​​여기에 남아 있기 때문에 ... sendMultipartTextMessage()를 사용하고 있을까요? 표준 단일 SMS 메시지 최대 길이 인 sendTextMessage()를 사용하는 동안 한도는 160 기호로 제한됩니다.