2017-06-08 1 views
1

Dans mon application Xamarin.Android j'envoie des SMS en utilisant la classe SmsManager. Je reçois également l'état de livraison en utilisant PendingIntent et BroadcastReceiver.
Tout fonctionne bien, sauf que je ne peux pas dire quel SMS est livré lorsque SMSDeliveredReceiver.OnReceive est appelé. Disons que j'envoie deux messages, je sais juste que l'un des messages envoyés est livré. J'ai besoin de savoir quel SMS est livré pour faire d'autres processus. S'il vous plaît dites-moi comment créer un pont entre SMS et la livraison.Xamarin.Android: Détecter les SMS dans le récepteur de diffusion de SMS livré

Voici mon code à ce jour:

private PendingIntent piSent, piDelivered; 
private BroadcastReceiver _smsSentBroadcastReceiver, _smsDeliveredBroadcastReceiver; 

void SetUp() 
{ 
    piSent = PendingIntent.GetBroadcast(this, 0, new Intent("SMS_SENT"), 0); 
    piDelivered = PendingIntent.GetBroadcast(this, 0, new Intent("SMS_DELIVERED"), 0); 

    _smsSentBroadcastReceiver = new SMSSentReceiver(); 
    _smsDeliveredBroadcastReceiver = new SMSDeliveredReceiver(); 

    RegisterReceiver(_smsSentBroadcastReceiver, new IntentFilter("SMS_SENT")); 
    RegisterReceiver(_smsDeliveredBroadcastReceiver, new IntentFilter("SMS_DELIVERED")); 

} 

void Send(string number, string message) 
{ 
    SmsManager.Default.SendTextMessage(q.Number, null, q.Message, piSent, piDelivered); 
} 

[BroadcastReceiver(Exported = true)] 
public class SMSDeliveredReceiver : BroadcastReceiver 
{ 
    public override void OnReceive(Context context, Intent intent) 
    { 
     Toast.MakeText(Application.Context, "SMSDeliveredReceiver.OnReceive", ToastLength.Short).Show(); 
     switch ((int)ResultCode) 
     { 
      case (int)Result.Ok: 
       Toast.MakeText(Application.Context, "SMS Delivered", ToastLength.Short).Show(); 
       break; 
      case (int)Result.Canceled: 
       Toast.MakeText(Application.Context, "SMS not delivered", ToastLength.Short).Show(); 
       break; 
      default: 
       Toast.MakeText(Application.Context, ResultCode.ToString(), ToastLength.Short).Show(); 

       break; 
     } 
    } 

} 
+0

Avez-vous ajouté la permission et le récepteur de diffusion dans le fichier manifeste/ –

+0

Oui @JaydeepPatel J'ai ajouté des autorisations et je le récepteur de radiodiffusion est appelé comme je l'ai mentionné ci-dessus, la question est de savoir comment détecter le SMS relatif? Je reçois la livraison mais lequel des SMS envoyés est cette livraison environ? –

+0

@JaydeepPatel Je connais Java mais ce lien ne m'aidera pas vraiment. Il s'agit de messages entrants, ma question concerne les messages envoyés. I Envoyer un tas de messages et que vous voulez vérifier l'état de livraison de chaque message. Le lien que vous avez fourni concerne les MESSAGES DE RÉCEPTION. –

Répondre

1

Utilisez Intent pour transmettre des données dans votre méthode SendTextMessage, lorsque votre SMSDeliveredReceiver.OnReceive est appelée, vous pouvez dire que SMS est délivré par intent.GetStringExtra("phone").

Voici le code complet et il fonctionne très bien:

[Activity(Label = "SMSDemo", MainLauncher = true, Icon = "@drawable/icon")] 
public class MainActivity : Activity 
{ 
    private static string ACTION_SENT_SMS = "ACTION_SENT_SMS"; 

    private PendingIntent piSentd; 
    SMSDeliveredReceiver mReceiver; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     SetContentView (Resource.Layout.Main); 
     Button button = FindViewById<Button>(Resource.Id.button1); 

     button.Click += (sender, e) => 
     { 
      sendGroupSMS(); 
     }; 

     mReceiver = new SMSDeliveredReceiver(); 
     RegisterReceiver(mReceiver, new IntentFilter(ACTION_SENT_SMS)); 
    } 

    protected override void OnDestroy() 
    { 
     base.OnDestroy(); 
     UnregisterReceiver(mReceiver); 
    } 

    void sendGroupSMS() 
    { 
     List<string> phones = new List<string>(); 
     phones.Add("1*****2"); 
     phones.Add("1*****8"); 
     phones.Add("1*****9"); 

     SmsManager smsMgr = SmsManager.Default; 
     foreach(string phone in phones) 
     { 
      Log.Debug("TAG", "Start sending sms to the phone " + phone); 
      Intent intent = new Intent(ACTION_SENT_SMS); 
      intent.PutExtra("phone", phone); 

      piSentd = PendingIntent.GetBroadcast(this, phone.GetHashCode(), intent, PendingIntentFlags.UpdateCurrent); 
      SmsManager.Default.SendTextMessage(phone, null, "Test by York", piSentd, null); 
     } 

    } 
} 

[BroadcastReceiver(Exported = true)] 
public class SMSDeliveredReceiver : BroadcastReceiver 
{ 
    public override void OnReceive(Context context, Intent intent) 
    { 
     string phone = intent.GetStringExtra("phone"); 
     switch ((int)ResultCode) 
     { 
      case (int)Result.Ok: 
       Toast.MakeText(Application.Context, "SMS Delivered" + phone + " success.", ToastLength.Short).Show(); 
       break; 
      case (int)Result.Canceled: 
       Toast.MakeText(Application.Context, "SMS not delivered", ToastLength.Short).Show(); 
       break; 
      default: 
       Toast.MakeText(Application.Context, ResultCode.ToString(), ToastLength.Short).Show(); 
       break; 
     } 
    } 

}