自动OTP验证android xamarin

时间:2017-03-23 07:55:25

标签: xamarin.android one-time-password

我正在使用Xamarin开发Android应用程序,其中服务器发送OTP,用户需要在应用程序中输入此OTP,以登录我的应用程序。我想要的是,我的应用程序应该能够自动读取服务器发送的OTP并填写OTP的编辑文本字段。

我差不多完成阅读邮件但无法在编辑文本字段中设置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)
        {

        }
    }

2 个答案:

答案 0 :(得分:0)

你的终点线。你只需要做这些事情:

  1. 创建一个具有公共方法onSMSReceived(String smsMsg)
  2. 的界面
  3. 实例化该界面。
  4. MainActivity活动中实施该界面。
  5. 覆盖MainActivity中的onSMSReceived(String smsMsg)
  6. 使用SMS广播接收器上面创建的界面通知MainActivity。
  7. 在MainActivity中填写onSMSReceived(String smsMsg)中收到的邮件。
  8. 你已经完成了。

答案 1 :(得分:0)

我没有准确地知道你是怎么做的,但我做了两件事, 1.用户必须手动输入, 我们必须通过编程自动阅读, 但是我在自动读取短信时面临一个问题,比如发送短信和读短信同时调用可能就像注册点击事件一样,我发现了另一种自动检测方式,如发送otps两次并将生成的otps存储在列表中字符串并与message.body进行比较 这里的问题是我们必须发送两次otp,我仍然想知道如何在一段时间之后调用读取短信的部分,,,!

如果您想要该解决方案,请发邮件至sailokeshgoud@gmail.com