2011-01-21 5 views
2

Android 폰에서 Java로 SMS 메시지를 보내면 한 번에 하나씩 처리 할 수 ​​있습니까?Android 폰에서 Java로 SMS 메시지를 보내면 한 번에 하나씩 처리 할 수 ​​있습니까?

휴대 전화에서 여러 개의 SMS 메시지를 보내려면이 애플리케이션을 만들었지 만 한 번에 하나씩 보내도록 변경하려면 어떻게해야합니까?

내가 응답 코드는 다음 중 하나를 보내기 전에 돌아 가야하는이 SMS 메시지를 보내고 기다릴 수 있도록 노력하고 다음 sendSms (에서

import android.telephony.gsm.SmsManager; 
import android.app.Activity; 
import android.app.PendingIntent; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.gsm.SmsManager; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

import android.util.Log; 
import android.widget.Button; 

import java.io.*; 
import android.util.LogPrinter; 

import java.io.*; 

import android.app.Activity; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.widget.TextView; 
import android.os.*; 

import android.app.Activity; 

import android.os.Bundle; 

import android.view.View; 

import android.view.View.OnClickListener; 

import android.widget.Button; 

import android.widget.Toast; 
import java.io.*; 

import android.app.Activity; 

import android.os.Bundle; 

import android.view.View; 

import android.view.View.OnClickListener; 

import android.widget.Button; 

import android.widget.Toast; 

public class JSSMS extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Button button = (Button) findViewById(R.id.Button01); 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Toast.makeText(JSSMS.this, "Starting SMS", Toast.LENGTH_LONG) 
         .show(); 

       String message = "Hello This Is John, Please save my new number"; 
       String number; 
       try { 
        BufferedReader buffreader = new BufferedReader(
          new FileReader(Environment 
            .getExternalStorageDirectory().toString() 
            + "/numbers.txt")); 
        int i = 0; 
        while ((number = buffreader.readLine()) != null) { 
         Toast.makeText(JSSMS.this, "Sending text to:" + number, 
           Toast.LENGTH_SHORT).show(); 
         sendSMS(number, message); 
        } 

        buffreader.close(); 
       } catch (java.io.FileNotFoundException e) { 
        Toast.makeText(JSSMS.this, e.toString(), Toast.LENGTH_SHORT) 
          .show(); 

       } catch (Exception e) { 
        Toast.makeText(JSSMS.this, e.toString(), Toast.LENGTH_SHORT) 
          .show(); 
       } 

       Toast.makeText(JSSMS.this, "DONE!!", Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 

    // ---Sends an SMS message to another device.--- 
    private void sendSMS(String phoneNumber, String message) { 
     String SENT = "SMS_SENT"; 
     String DELIVERED = "SMS_DELIVERED"; 

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

     PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, 
       new Intent(DELIVERED), 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)); 

     // ---When the SMS has been delivered--- 
     registerReceiver(new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context arg0, Intent arg1) { 
       switch (getResultCode()) { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case Activity.RESULT_CANCELED: 
        Toast.makeText(getBaseContext(), "SMS not delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       } 
      } 
     }, new IntentFilter(DELIVERED)); 

     SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); 
    } 
} 
+4

에 오신 것을 환영있어. 첫 번째 질문과 함께 몇 개의 downvotes를 가져 왔다니 유감입니다. 귀하의 질문은 합리적이라고 생각하지만 때로는 사람들이 "XXX 할 코드를 보여주십시오"라는 정보 외에도 약간의 정보를 제공하는 질문에 반응합니다. 그러나 코드를 제공 했으므로 인내심이 조금이라도있는 사람이라면 몇 가지 정보를 얻을 수 있습니다. 너를 돕는 사람들을 upvote하는 것을 잊지 마라! –

답변

1

다음은 올바른 방향으로 설정하는 일반적인 힌트입니다. 비동기 방식으로 처리하려는 항목의 대기열이있는 경우 한 가지 방법은 콜백/이벤트 핸들러/call-it-what-you-will을 사용하여 대기열의 다음 요소 처리를 트리거하는 것입니다.

  • 이 방법이, 예를 들어, 메시지 대기열을 설정 큐 웃옷 메시지를 팝하고 onReceive 방법, 지금 그것을
  • 를 보냅니다 'sendNextMessage은'당신은이 방법이 작동하려면 큐

에서 다음 중 하나를 전송 트리거하기 위해 sendNextMessage를 호출 할 수 있습니다 성공 또는 실패에 관계없이 어떤 종류의 콜백을 보장받을 수 있어야합니다.

+0

에서 이메일을 보내 주실 수 있습니까? – SJS

1

봐) 방법을 this 클래스.

sendTextMessage()으로 전화하면 "보낸"및 "배달 된"의도를 전달할 수 있습니다. 이러한 의도를 자신의 응용 프로그램으로 다시 지정하십시오. SMS를 보내거나 전달할 때 말할 수 있도록 콜백을 할 수 있습니다.

참조 원본 파일과 동일한 프로젝트에서 AndroidManifest.xml 파일을 보면 "sms_sent"(및 "sms_received") 의도에 대해 등록 된 두 개의 수신자가 있음을 알 수 있습니다. 언급 한 방법을 보면 sendTextMessage()을 호출하기 전에 "sms_sent"및 "sms_delivered"라는 두 개의 인 텐트가 만들어 짐을 알 수 있습니다. SMS 전송이 완료되면이를 알리는 방법입니다.

+0

나는 아직도 이해하지 않는다! 여기 farble 도와 줄 수 – SJS

+0

예요 farble하지만이 일을하는 데 어려움을 겪고 있습니다. [email protected] – SJS

0

우선 첫 번째가 네 단계

1 단계 개방 버튼 클릭이나 의도를 보류 만들

2 단계를 보내는 유 SMS를 시작 어떤 트리거 보류 중의 복수와 함께 당연히 의도 개체에 방송 될 다섯에 능력을 보내는 여러 SMS에 대한 의도를 ... ...

3 단계는 등록 된 방송 수신기는 I 반복, 결과에 따라 대기중인 의도

4 단계 및 수신 된 의도를 받게됩니다 텐트 오브젝트는 u는 여기 ... 다음 메시지를 보내 내가 충분히 읽을의 신뢰 그것을

위한 코드입니다 ... 스택 오버플하는 멋진

public class SMSDoer extends Activity { 
String SENT = "SMS_SENT"; 
String DELIVERED = "SMS_DELIVERED"; 
PendingIntent sentPI, deliveredPI; 
BroadcastReceiver smsSentReceiver, smsDeliveredReceiver; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

} 

@Override 
public void onResume() { 
super.onResume(); 
//---create the BroadcastReceiver when the SMS is sent--- 
smsSentReceiver = new BroadcastReceiver(){ 
@Override 
public void onReceive(Context arg0, Intent intent) { 
switch (getResultCode()) 
{ 
case Activity.RESULT_OK: 
Toast.makeText(getBaseContext(), “SMS Gone With the wind”, 
//db.query update database for recurrisive message calling 
//using intent object for specific message 
sendSMS(“db.phoneNumber", "db.msg"); 

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



//---create the BroadcastReceiver when the SMS is delivered--- 
smsDeliveredReceiver = new BroadcastReceiver(){ 
@Override 
public void onReceive(Context arg0, Intent arg1) { 
switch (getResultCode()) 
{ 
case Activity.RESULT_OK: 
Toast.makeText(getBaseContext(), “SMS delivered”, 
Toast.LENGTH_SHORT).show(); 
break; 
case Activity.RESULT_CANCELED: 
Toast.makeText(getBaseContext(), “SMS not delivered”, 
Toast.LENGTH_SHORT).show(); 
break; 
} 
} 
}; 
//---register the two BroadcastReceivers--- 
registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED)); 
registerReceiver(smsSentReceiver, new IntentFilter(SENT)); 
} 

@Override 
public void onPause() { 
super.onPause(); 
//---unregister the two BroadcastReceivers--- 
unregisterReceiver(smsSentReceiver); 
unregisterReceiver(smsDeliveredReceiver); 
} 
public void SmsMaker(View v) { 
//query database 
sendSMS(“db.phoneNumber", "db.msg", db.row); 
} 
//---sends an SMS message to another device--- 
private void sendSMS(String phoneNumber, String message, int rowId) 
{ 
//create multiple Pending intent 
sentPI = PendingIntent.getBroadcast(this,rowId, new Intent(SENT), 0); 
deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0); 

SmsManager sms = SmsManager.getDefault(); 
sms.sendTextMessage(phoneNumber, "+29170000017", message, sentPI,deliveredPI); 
} 
} 
관련 문제