【发布时间】:2019-07-21 00:41:27
【问题描述】:
我正在尝试使用 Google 的 SMS Retriever API 进行自动 SMS 验证。我已按照here 的指示进行操作,但我的应用没有收到任何 SMS 消息。我尝试了很多方法,但仍然无法正常工作,我真的不明白为什么。
这就是我所做的。首先我创建类MySMSBroadcastReceiver:
public class MySMSBroadcastReceiver extends BroadcastReceiver {
public OTPReceiveListener otpReceiveListener;
public void initOtpReceiveListener(OTPReceiveListener otpReceiveListener) {
this.otpReceiveListener = otpReceiveListener;
}
@Override
public void onReceive(Context context, Intent intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
Bundle extras = intent.getExtras();
Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
switch(status.getStatusCode()) {
case CommonStatusCodes.SUCCESS:
// Get SMS message contents
String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
otpReceiveListener.onOTPReceived(message);
break;
case CommonStatusCodes.TIMEOUT:
otpReceiveListener.onOTPTimeOut();
break;
}
}
}
public interface OTPReceiveListener {
void onOTPReceived(String otp);
void onOTPTimeOut();
}
}
对于OTPActivity类,我删除了不相关的代码:
public class OTPActivity extends BaseActivity implements IDelegateResponse<OTPResponse>, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, MySMSBroadcastReceiver.OTPReceiveListener {
@BindView(R.id.edtSmsOtp)
EditText edtSmsOtp;
private final String TAG = "OTPActivity";
private MySMSBroadcastReceiver mySMSBroadcastReceiver;
@Override
public int getLayoutID() {
return R.layout.activity_otp;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setUpOTPSms();
}
private void setUpOTPSms() {
AppSignatureHelper appSignatureHelper = new AppSignatureHelper(OTPActivity.this);
Utils.showLog(TAG, "getAppSignatures:" + appSignatureHelper.getAppSignatures());
mySMSBroadcastReceiver = new MySMSBroadcastReceiver();
mySMSBroadcastReceiver.initOtpReceiveListener(this);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(SmsRetriever.SMS_RETRIEVED_ACTION);
intentFilter.setPriority(2147483647);
registerReceiver(mySMSBroadcastReceiver, intentFilter);
startSMSListener();
}
private void startSMSListener() {
SmsRetrieverClient client = SmsRetriever.getClient(OTPActivity.this);
Task<Void> task = client.startSmsRetriever();
task.addOnSuccessListener(aVoid -> {
//Toast.makeText(OTPActivity.this, "SMS Retriever starts", Toast.LENGTH_LONG).show();
Utils.showLog(TAG, "SMS Retriever starts");
});
task.addOnFailureListener(e -> Toast.makeText(OTPActivity.this, "Error", Toast.LENGTH_LONG).show());
}
@Override
public void onConnected(@Nullable Bundle bundle) {
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
public void onOTPReceived(String otp) {
if (mySMSBroadcastReceiver != null) {
unregisterReceiver(mySMSBroadcastReceiver);
}
Utils.showLog("OTP Received", "OTP: " + otp);
}
@Override
public void onOTPTimeOut() {
Utils.showLog("OTP Received", "onOTPTimeOut");
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mySMSBroadcastReceiver != null) {
unregisterReceiver(mySMSBroadcastReceiver);
}
}
}
【问题讨论】:
-
你获得短信权限了吗?
-
什么权限,我加了
-
试试这个
-
我认为这不是真的,因为 Google 的 SMS Retriever API 不需要权限
-
是的,你是对的人,问题是别的
标签: android sms one-time-password