2012-03-25 17 views
0

1分ごとに1つの受信者に複数のSMSメッセージを送信するAppの作成中です。これらのメッセージには、オブジェクトにアタッチされた追跡システムの一部としてのGPS座標が含まれています。同じ受信者に複数のSMSを送信できる送信トレイを作成するにはどうすればよいですか?

オブジェクトが信号の内外を移動するため、メッセージが送信される場合と送信されない場合があります。私はこれらのメッセージを保存し、後でそれらを送信したいと思います。これは、オブジェクトが次の信号であるときにたくさんのSMSメッセージを送信する必要があることを意味します。しかしながら。私は記憶されたメッセージを送信しようとすると問題に遭う。 SMSメッセージがBroadcastReceiverに属しているものを特定する方法はありますか?これを知っていると、送信されなかったメッセージを(後で送信するために)保存することができ、同時に送信済みのメッセージはすべて削除されます。

IEオブジェクトは信号を伝搬しません。 1分ごとにGPS座標が取得されます。メッセージは送信されないので、ベクトルに格納されます。 5分後に、オブジェクトは5つのメッセージを送信して信号に戻ります。これらの5つのメッセージの送信中にオブジェクトが信号を失うと、3つのメッセージ(特定の順序なし)を送信することができます。

一部のコードは次のとおりです。

public class FixingmsgsActivity extends Activity { 

private static final int MAX_SMS_MESSAGE_LENGTH = 160;     
private static final String SMS_DELIVERED = "SMS_DELIVERED";   
private static final String SMS_SENT = "SMS_SENT"; 

private String SendTo = "02102980174"; 
private String SendToFull = "+642102980174"; 

private Vector<String> testmsg = new Vector<String>(); 




/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    registerReceiver(sendreceiver, new IntentFilter(SMS_SENT));   
    registerReceiver(deliveredreceiver, new IntentFilter(SMS_DELIVERED)); 
// registerReceiver(smsreceiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); 

    testmsg.addElement("one"); 
    testmsg.addElement("two"); 
    testmsg.addElement("three"); 
    testmsg.addElement("four"); 
    testmsg.addElement("five"); 
    testmsg.addElement("six"); 
    testmsg.addElement("seven"); 
    testmsg.addElement("eight"); 
    testmsg.addElement("nine"); 


    for(int i=0;i < testmsg.size();i++){ 
     sendSms(SendTo,testmsg.elementAt(i)); 
    } 
} 


private void sendSms(String phonenumber,String message){      
    SmsManager manager = SmsManager.getDefault();      
    Intent sendIntent = new Intent("SMS_SENT"); 
    sendIntent.putExtra("message", message);   
    PendingIntent piSend = PendingIntent.getBroadcast(this, 0, sendIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    PendingIntent piDelivered = PendingIntent.getBroadcast(this, 0, new Intent(SMS_DELIVERED), 0); 

    int length = message.length();          
      if(length > MAX_SMS_MESSAGE_LENGTH)     
      {       
       ArrayList<String> messagelist = manager.divideMessage(message);        
       manager.sendMultipartTextMessage(phonenumber, null, messagelist, null, null);     
      }     
      else     
      {    
       //Toast.makeText(getBaseContext(), message, Toast.LENGTH_SHORT).show(); 
       manager.sendTextMessage(phonenumber, null, message, piSend, piDelivered); 
      }   
}  

private BroadcastReceiver sendreceiver = new BroadcastReceiver()   
{     

    @Override     
    public void onReceive(Context context, Intent intent)     
    { 

    switch(getResultCode())       
    {         
     case Activity.RESULT_OK: //Message has been sent 
     break; 

     case SmsManager.RESULT_ERROR_GENERIC_FAILURE: //message not sent. Which one? I would like to store this SMS so I can send it later. 
     break; 

     case SmsManager.RESULT_ERROR_NO_SERVICE: //message not sent. Which one? 
     break; 

     case SmsManager.RESULT_ERROR_NULL_PDU: //message not sent. Which one? 
     break; 

     case SmsManager.RESULT_ERROR_RADIO_OFF: //message not sent. Which one? 
     break;       
    }              

    }   
    };  

    private BroadcastReceiver deliveredreceiver = new BroadcastReceiver() 

    {     
     @Override     
     public void onReceive(Context context, Intent intent)     
     {       
      String info = "Delivery information: ";              
      switch(getResultCode())       
      {         
      case Activity.RESULT_OK: info += "delivered"; 
      break;         
      case Activity.RESULT_CANCELED: info += "not delivered"; 
      break;       
      }                 
     }   
    };     
    } 

しかし私は、これが唯一のbroadcastreceiverに余分な最後のSMSを与えるputExtraとインテントを使用して試してみました。たとえば上記のコードでは、onrecieveメソッドの余分な "メッセージ"は "nine" "nine" "nine" "nine" "nine" "nine" "nine" "nine" "nine"を出力します。

I私はこれは私が送信され、どのような1が長い読み取りのための

申し訳ありませんでしたいませんでした何のメッセージを識別することができwiould「1」「2」など

ようなものにしたい複数のメッセージを送ります。ありがとう ダニエルH

答えて

0

私は今考え出したと思います。

私のエラーは、すべてのSMSメッセージを送信するforループを作成することにありました。これにより、複数の受信者のいずれかが作成されるか、Onrecieveの電話がどのSMSに属しているかに関する受信者の情報が失われます。私は...

public void sendSms(){ 
     //messagev = vector or arraylist of messages to be sent 
     //So that there are no over run errors. 
     //IE not sending blank messages 
     if (messagev.isEmpty()){ 
      return; 
     } 

     SmsManager manager = SmsManager.getDefault(); 


//only send the last element in the array. This will allow the latest message to be sent 
//due to adding messages to messagev being appended on the end. 
     String message = messagev.lastElement(); 

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

//register a new reciever for the sms to be sent. 
     registerReceiver(new BroadcastReceiver(){ 

     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
      case Activity.RESULT_OK: 


       arg0.unregisterReceiver(this); //remove reciever for this sms 
       messagev.removeElementAt(messagev.size()-1); //remove the element from the message array 
       if (!messagev.isEmpty()){ //if there are more messages to send then cann the sendSms function again. 
        sendSms(); 
       } 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
arg0.unregisterReceiver(this); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
arg0.unregisterReceiver(this); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
arg0.unregisterReceiver(this); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
arg0.unregisterReceiver(this); 
       break; 
      } 
     } 
     },new IntentFilter(SMS_SENT)); 
     manager.sendTextMessage(SendTo, null, message, sentPI, null); //send the sms 
    } 

と呼ばれるこの機能は、送信するすべてのメッセージを介して(再帰のようなものを通じて)反復なりましたし、それが送られた場合、それはコレクションからそのSMSを削除します何

SMSが送信されない場合、受信者の登録が解除され、SMSはSMSの配列から削除されず、次にsendSmsメソッドが呼び出されたときに送信を試みます。

このメソッドには登録解除レシーバがデフォルトで設定されている必要があります。すべてがポットになった場合、受信者は登録解除されます。それ以外の場合は正常に動作するようです。 乾杯 - Daniel H

関連する問題