我正在开发一个Android应用程序,其中服务器发送OTP并且用户需要在应用程序中输入此OTP,以登录我的应用程序。我想要的是,我的应用程序应该能够自动读取服务器发送的OTP。我怎样才能做到这一点?在这方面的任何帮助或指导将受到高度赞赏。
谢谢..!提前
答案 0 :(得分:1)
您有3个选项可以自动阅读OTP短信:
<强> 1。使用短信权限读取所有传入的短信:
http://androidbymaitri.blogspot.in/2016/08/read-sms-automatically-to-verify-otp.html
不再建议,因为这需要用户明确授予SMS权限。
<强> 2。在Google Play服务中使用SMS Retriever API:
https://developers.google.com/identity/sms-retriever/overview
https://www.youtube.com/watch?v=jzWYv8y2v1c
通知。但这需要在OTP SMS格式中进行一些服务器级别的更改。这仅适用于安装了Play服务的设备。
第3。在SmsManager类中使用createAppSpecificSmsToken(仅限Android O):
https://code.tutsplus.com/tutorials/android-o-phone-number-verification-with-sms-token--cms-29141
不建议,因为这仅适用于Android O,截至目前。
答案 1 :(得分:0)
在manifest
中,添加这些权限
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
在build.gradle
中(应用程序gradle)
implementation 'com.github.stfalcon:smsverifycatcher:0.3.2'
在onCreate活动中初始化SmsVerifyCatcher
smsVerifyCatcher = new SmsVerifyCatcher(getActivity(), new OnSmsCatchListener<String>() {
@Override
public void onSmsCatch(String message) {
String code = parseCode(message);//Parse verification code
Log.d("Agilanbu OTP", code);
Toast.makeText(getActivity(), "Agilanbu OTP: " + code, Toast.LENGTH_LONG).show();
et_otp.setText(code);//set code in edit text
}
});
活动生命周期中
@Override
protected void onStart() {
super.onStart();
smsVerifyCatcher.onStart();
}
@Override
protected void onStop() {
super.onStop();
smsVerifyCatcher.onStop();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
smsVerifyCatcher.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
解析消息
private String parseCode(String message) {
Pattern p = Pattern.compile("\\b\\d{6}\\b");
Matcher m = p.matcher(message);
String code = "";
while (m.find()) {
code = m.group(0);
}
return code;
}
答案 2 :(得分:0)
Google Play 不再允许RECIEVE_SMS permission
,除非您的应用是默认短信处理程序,除非。
因此,到目前为止,一种可行的解决方案是使用SMS_RETRIEVE_API
您将需要一个BroadcastReceiver
和一个执行SmsRetriever.getClient(context).startSmsRetriever();
在您的接收器中:
if(SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
Bundle extras = intent.getExtras();
Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
final String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
}