2017-03-23 76 views
0

我正在使用Xamarin在其中的服務器發送OTP並且用戶需要在應用程序中輸入此OTP以對我的應用程序進行註冊的Android應用程序。我想要的是,我的應用程序應該能夠自動讀取服務器發送的OTP並在OTP的編輯文本字段中填寫。汽車OTP驗證android xamarin

我幾乎已經完成了讀取消息,但無法在編輯文本字段中設置otp。

短信廣播接收器類:

[BroadcastReceiver(Enabled = true, Label = "SMS Receiver")] 
[IntentFilter(new string[] { "android.provider.Telephony.SMS_RECEIVED" })] 
public class SMSBroadcastReceiver : BroadcastReceiver 
{ 
    private const string IntentAction = "android.provider.Telephony.SMS_RECEIVED"; 
public override void OnReceive(Context context, Intent intent) 
{ 
     try 
    { 
      if (intent.Action != IntentAction) return; 
      var bundle = intent.Extras; 
     if (bundle == null) return; 
     var pdus = bundle.Get("pdus"); 
      // var castedPdus = JNIEnv.GetArray(pdus.Handle); 
      var castedPdus = JNIEnv.GetArray<Java.Lang.Object>(pdus.Handle); 
      var msgs = new SmsMessage[castedPdus.Length]; 
      var sb = new StringBuilder(); 
     string sender = null; 
      for (var i = 0; i < msgs.Length; i++) 
       { 
       var bytes = new byte[JNIEnv.GetArrayLength(castedPdus[i].Handle)]; 
       JNIEnv.CopyArray(castedPdus[i].Handle, bytes); 
       string format = bundle.GetString("format"); 
      msgs[i] = SmsMessage.CreateFromPdu(bytes,format); 
      if (sender == null) 
        sender = msgs[i].OriginatingAddress; 
       sb.Append(string.Format("SMS From: {0}{1}Body: {2}{1}", msgs[i].OriginatingAddress,System.Environment.NewLine, msgs[i].MessageBody)); 
       Toast.MakeText(context, sb.ToString(), ToastLength.Long).Show(); 
      } 
     } 
     catch (System.Exception ex) 
     { 
      Toast.MakeText(context, ex.Message, ToastLength.Long).Show(); 
    } 
    } 
} 

這裏是我的主要活動:

[Activity(Label = "UserSms", MainLauncher = true, Icon = "@drawable/icon")] 
public class MainActivity : Activity 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Set our view from the "main" layout resource 
     SetContentView (Resource.Layout.Main); 
    SMSBroadcastReceiver smsReceiver = new SMSBroadcastReceiver(); 
    TextView msg = FindViewById<TextView>(Resource.Id.editTextOtp); 
    Button btn = FindViewById<Button>(Resource.Id.button3); 
     RegisterReceiver(smsReceiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); 
    } 
    } 

我怎樣才能做到這一點?任何有關這方面的幫助或指導將受到高度讚賞。

更新

public void onSMSReceived(string msgs) 
    { 
     EditText OtpNumber = (EditText)FindViewById(Resource.Id.editTextOtp); 
     try 
     { 
      OtpNumber.SetText(msgs.ToString(),null); 
     } 
     catch (System.Exception ex) 
     { 

     } 
    } 

回答

0

你都在終點線。你只需要做這些事情:

  1. 創建一個將具有公共方法onSMSReceived(String smsMsg)
  2. 實例化接口的接口。
  3. MainActivity活動中實現該接口。
  4. 覆蓋您MainActivity中的onSMSReceived(String smsMsg)
  5. 使用上面創建的SMS廣播接收器接口通知MainActivity。
  6. 在您的MainActivity中填入onSMSReceived(String smsMsg)中收到的消息。
  7. 你完成了。
+0

我試過,但對於me.Can你細說這一點bit.Thanks –

+0

這部分你不明白它不工作? – Geek

+0

按照你的建議實施,但它沒有奏效。你可以提供示例代碼。它可以節省我的一天 –

0

我沒有得到正是你怎麼做,但我在兩個方面做到了, 1.用戶必須手動輸入, 2.我們必須通過編程自動讀取, 但我在自動閱讀短信時遇到了一個問題,比如發送短信和閱讀短信同時打電話可能就像註冊點擊事件一樣,我發現了另一種自動檢測方式,如發送兩次otps並將生成的短語存儲在字符串列表中並與message.body 這裏的問題是,我們必須發送otp兩次,仍然我搞清楚如何在一段時間後讀取短信部分,,,!

如果您希望解決PLZ郵件我在sailokeshgou[email protected]