只读取 OTP 的短信
Read sms only for OTP
在我的 android 应用程序中,我从短信中实现了自动填充 OTP,我从中学到了 link http://androiddhina.blogspot.in/2015/06/reading-incoming-message-automatically-to-verify-OTP.html
我的疑问是 BroadcastReceiver
读取用户收到的每条短信,我们可以停止吗?我需要在特定时间阅读短信示例:只有在用户点击发送 OTP 按钮之后我才应该停止阅读短信。
请帮助我如何在特定时间段启动和停止 BroadcastReceiver
。
试试这个。
private BroadcastReceiver SmsListener = new BroadcastReceiver() {
@SuppressWarnings("deprecation")
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(
"android.provider.Telephony.SMS_RECEIVED")) {
Bundle bundle = intent.getExtras(); // ---get the SMS message
// passed in---
SmsMessage[] msgs = null;
// String msg_from;
if (bundle != null) {
// ---retrieve the SMS message received---
try {
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage
.createFromPdu((byte[]) pdus[i]);
// msg_from = msgs[i].getOriginatingAddress();
String msgBody = msgs[i].getMessageBody();
// do your stuff
}
} catch (Exception e) {
// Log.d("Exception caught",e.getMessage());
}
}
}
}
};
和我一样
@Override
protected void onPause() {
super.onPause();
YourActivity.this.unregisterReceiver(SmsListener);
};
@Override
protected void onResume() {
super.onResume();
IntentFilter i = new IntentFilter(
"android.provider.Telephony.SMS_RECEIVED");
YourActivity.this.registerReceiver(SmsListener, i);
}
但正如其他人建议的那样,您可以在请求 OTP 后注册 BroadcastReceiver,并在获得 OTP 后取消注册。
编码愉快。
您可以随时启用和禁用接收器。尝试以下操作,
用于启用接收器
public void enableSMSReceiver(Context context){
ComponentName component = new ComponentName(context, YOUR_RECEIVER.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(
component,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
为了禁用接收器
public static void disableSMSReceiver(Context context){
ComponentName component = new ComponentName(context, YOUR_RECEIVER.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(
component,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
现在有其他选项可以自动读取 OTP 短信,您的应用程序只读取您的 OTP 短信,不需要用户授予任何权限。
1.在 Google 中使用 SMS Retriever API 播放服务:
https://developers.google.com/identity/sms-retriever/overview
https://www.youtube.com/watch?v=jzWYv8y2v1c
但这需要对 OTP SMS 格式进行一些服务器级别的更改。这仅适用于安装了 Play 服务的设备。
2。在 SmsManager class 中使用 createAppSpecificSmsToken(仅来自 Android O):
https://code.tutsplus.com/tutorials/android-o-phone-number-verification-with-sms-token--cms-29141
目前仅适用于 Android O。
在我的 android 应用程序中,我从短信中实现了自动填充 OTP,我从中学到了 link http://androiddhina.blogspot.in/2015/06/reading-incoming-message-automatically-to-verify-OTP.html
我的疑问是 BroadcastReceiver
读取用户收到的每条短信,我们可以停止吗?我需要在特定时间阅读短信示例:只有在用户点击发送 OTP 按钮之后我才应该停止阅读短信。
请帮助我如何在特定时间段启动和停止 BroadcastReceiver
。
试试这个。
private BroadcastReceiver SmsListener = new BroadcastReceiver() {
@SuppressWarnings("deprecation")
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(
"android.provider.Telephony.SMS_RECEIVED")) {
Bundle bundle = intent.getExtras(); // ---get the SMS message
// passed in---
SmsMessage[] msgs = null;
// String msg_from;
if (bundle != null) {
// ---retrieve the SMS message received---
try {
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage
.createFromPdu((byte[]) pdus[i]);
// msg_from = msgs[i].getOriginatingAddress();
String msgBody = msgs[i].getMessageBody();
// do your stuff
}
} catch (Exception e) {
// Log.d("Exception caught",e.getMessage());
}
}
}
}
};
和我一样
@Override
protected void onPause() {
super.onPause();
YourActivity.this.unregisterReceiver(SmsListener);
};
@Override
protected void onResume() {
super.onResume();
IntentFilter i = new IntentFilter(
"android.provider.Telephony.SMS_RECEIVED");
YourActivity.this.registerReceiver(SmsListener, i);
}
但正如其他人建议的那样,您可以在请求 OTP 后注册 BroadcastReceiver,并在获得 OTP 后取消注册。
编码愉快。
您可以随时启用和禁用接收器。尝试以下操作,
用于启用接收器
public void enableSMSReceiver(Context context){
ComponentName component = new ComponentName(context, YOUR_RECEIVER.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(
component,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
为了禁用接收器
public static void disableSMSReceiver(Context context){
ComponentName component = new ComponentName(context, YOUR_RECEIVER.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(
component,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
现在有其他选项可以自动读取 OTP 短信,您的应用程序只读取您的 OTP 短信,不需要用户授予任何权限。
1.在 Google 中使用 SMS Retriever API 播放服务:
https://developers.google.com/identity/sms-retriever/overview
https://www.youtube.com/watch?v=jzWYv8y2v1c
但这需要对 OTP SMS 格式进行一些服务器级别的更改。这仅适用于安装了 Play 服务的设备。
2。在 SmsManager class 中使用 createAppSpecificSmsToken(仅来自 Android O):
https://code.tutsplus.com/tutorials/android-o-phone-number-verification-with-sms-token--cms-29141
目前仅适用于 Android O。