我正在使用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)
{
}
}
答案 0 :(得分:0)
你的终点线。你只需要做这些事情:
onSMSReceived(String smsMsg)
MainActivity
活动中实施该界面。onSMSReceived(String smsMsg)
onSMSReceived(String smsMsg)
中收到的邮件。答案 1 :(得分:0)
我没有准确地知道你是怎么做的,但我做了两件事, 1.用户必须手动输入, 我们必须通过编程自动阅读, 但是我在自动读取短信时面临一个问题,比如发送短信和读短信同时调用可能就像注册点击事件一样,我发现了另一种自动检测方式,如发送otps两次并将生成的otps存储在列表中字符串并与message.body进行比较 这里的问题是我们必须发送两次otp,我仍然想知道如何在一段时间之后调用读取短信的部分,,,!
如果您想要该解决方案,请发邮件至sailokeshgoud@gmail.com