2011-01-23 12 views
8

Próbowałem uzyskać kod wyniku statusu z sendMultipartTextMessage, nie rozumiem, czy odbiornik działa z sendTextMessage, dlaczego nie działa z sendMultipartTextMessage? Szukałem daleko i szukałem przykładów kodu, ale nie widziałem żadnych oczywistych powodów, dla których to przyzwyczajenie. Czy ktoś może rzucić jakieś światło na ten temat?Broadcast Receiver z sendMultiPartTextMessage

ArrayList<String> messages = sms.divideMessage(text); 
int messageCount = messages.size(); 
ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>(messageCount); 
ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(messageCount); 

for (int j = 0; j < messageCount; j++) { 
    sentIntents.add(
      PendingIntent.getBroadcast(context, 0, new Intent(SENT_ACTION), 
      0)); 
} 
sms.sendMultipartTextMessage(phoneNumber, null, messages, sentIntents, null); 

Oto mój BroadcastReceiver:

private BroadcastReceiver messageSentReceiver = new BroadcastReceiver() {  
    @Override 
    public void onReceive(Context context, Intent intent) { 
     switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       Toast.makeText(context, "SMS sent", Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       Toast.makeText(context, "Generic failure", Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
       Toast.makeText(context, "No service", Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
       Toast.makeText(context, "Null PDU", Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       Toast.makeText(context, "Radio off", Toast.LENGTH_SHORT).show(); 
       break; 
      } 
     } 
}; 

Kod odbywa się jak poniżej:

sentIntents = new ArrayList<PendingIntent>(); 
sentIntent = PendingIntent.getBroadcast(context, 0, new Intent(SENT_ACTION), 0); 
deliveredIntent = PendingIntent.getBroadcast(context, 0, new Intent(DELIVERED_ACTION), 0); 

context.registerReceiver(messageSentReceiver, new IntentFilter(SENT_ACTION)); 
context.registerReceiver(messageDeliveredReceiver, new IntentFilter(DELIVERED_ACTION)); 

Jeśli ktoś mógłby rzucić jakieś światło na to, będę naprawdę wdzięczny. Po prostu nie rozumiem, dlaczego to zadziałało z sendTextMessage, ale nie na sendMultipartTextMessage.

Dzięki.

Odpowiedz

0

Spróbuj ustawić opcję IntentFilter na (SENT) zamiast (SENT_ACTION). To działa dobrze dla mnie.

5

Cześć, brakuje Ci nazwy odbiornika brodcast w twoim zamyśle.

Spróbuj poniżej kod to działa dobrze dla mnie ..

ArrayList<PendingIntent> sentPendingIntents = new ArrayList<PendingIntent>(); 
    ArrayList<PendingIntent> deliveredPendingIntents = new ArrayList<PendingIntent>(); 
    PendingIntent sentPI = PendingIntent.getBroadcast(mContext, 0, 
      new Intent(mContext, SmsSentReceiver.class), 0); 

    PendingIntent deliveredPI = PendingIntent.getBroadcast(mContext, 0, 
      new Intent(mContext, SmsDeliveredReceiver.class), 0); 
    try { 
     SmsManager sms = SmsManager.getDefault(); 
     ArrayList<String> mSMSMessage = sms.divideMessage(message); 
     for (int i = 0; i < mSMSMessage.size(); i++) { 
      sentPendingIntents.add(i, sentPI); 

      deliveredPendingIntents.add(i, deliveredPI); 
     } 
     sms.sendMultipartTextMessage(phoneNumber, null, mSMSMessage, 
       sentPendingIntents, deliveredPendingIntents); 

    } catch (Exception e) { 

     e.printStackTrace(); 
     Toast.makeText(mContext, "SMS sending failed...", 
       Toast.LENGTH_SHORT).show(); 
    } 

Tworzenie odbiornik boardcast wysłanych sms jak poniżej.

public class SmsSentReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    switch (getResultCode()) { 
    case Activity.RESULT_OK: 
     Toast.makeText(context, 
       "SMS Sent" + intent.getIntExtra("object", 0), 
       Toast.LENGTH_SHORT).show(); 

     break; 
    case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
     Toast.makeText(context, "SMS generic failure", Toast.LENGTH_SHORT) 
       .show(); 

     break; 
    case SmsManager.RESULT_ERROR_NO_SERVICE: 
     Toast.makeText(context, "SMS no service", Toast.LENGTH_SHORT) 
       .show(); 

     break; 
    case SmsManager.RESULT_ERROR_NULL_PDU: 
     Toast.makeText(context, "SMS null PDU", Toast.LENGTH_SHORT).show(); 
     break; 
    case SmsManager.RESULT_ERROR_RADIO_OFF: 
     Toast.makeText(context, "SMS radio off", Toast.LENGTH_SHORT).show(); 
     break; 
    } 
} 

Utwórz kolejny odbiornik dla wiadomości SMS, jak pokazano poniżej.

public class SmsDeliveredReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent arg1) { 
    switch (getResultCode()) { 
    case Activity.RESULT_OK: 
     Toast.makeText(context, "SMS delivered", Toast.LENGTH_SHORT).show(); 
     break; 
    case Activity.RESULT_CANCELED: 
     Toast.makeText(context, "SMS not delivered", Toast.LENGTH_SHORT).show(); 
     break; 
    } 
} 

}

I wreszcie oświadczyć odbiornik w manifeście.

<receiver android:name=".receiver.SmsSentReceiver" > 
    </receiver> 
    <receiver android:name=".receiver.SmsDeliveredReceiver" > 
    </receiver> 
+0

Czy konieczne jest utworzenie dwóch różnych klas? –

Powiązane problemy