2017-06-08 26 views
1

私のXamarin.Androidでは、SmsManagerクラスを使用してSMSを送信します。 PendingIntentBroadcastReceiverを使用して配送ステータスを取得します。
SMSDeliveredReceiver.OnReceiveが呼び出されたときに、どのSMSが配信されているかわからないことを除いて、すべて正常に動作します。送信されたメッセージの1つが配信されたことを知っている2つのメッセージを送信するとします。さらなる処理を行うためにどのSMSが配信されているかを知る必要があります。 SMSと配信の間にブリッジを作成する方法を教えてください。ここでXamarin.Android:SMSで配信されたブロードキャスト受信者のSMSを検出

は、これまでの私のコードです:

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

あなたが/マニフェストファイルに –

+0

はい@JaydeepPatelを許可し、放送受信機を追加しました私は権限を追加しましたし、私が述べたように私は、放送受信機が呼び出されます上記の質問は、相対SMSを検出する方法ですか?私は配達を得るが、送られたSMSのどれがこの配達であるか? –

+0

@JaydeepPatel私はJavaを知っていますが、そのリンクは実際に私を助けません。それはIncoming Messagesについてですが、私の質問はSent Messagesに関するものです。私はたくさんのメッセージを送信し、各メッセージの納品状況を確認したい。あなたが提供したリンクはメッセージを受信することです。 –

答えて

1

使用IntentあなたSMSDeliveredReceiver.OnReceiveが呼び出されたとき、あなたはintent.GetStringExtra("phone")で配信されているSMS伝えることができ、あなたのSendTextMessage方法でデータを渡すために。ここで

は完全なコードで、それが正常に動作します:

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

} 
関連する問題