我已经在google教程和我的调试Build Variant工作中实现了SMS Retriever API
。我可以读取短信并获取用户可以登录的代码。
我的问题是,当我在发布版本Variant中运行应用程序sms它不起作用。我收到了短信,但我无法读取代码进行登录。
我在发布模式下更改了AppSignatureHelper 生成的哈希,这与调试模式不同。在调试工作和发布没有。
一些帮助将是欣赏
代码:
表现:
<receiver android:name=".app.receivers.SmsReceiver">
<intent-filter>
<action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>
</intent-filter>
</receiver>
在我的课程中:(在发布和调试模式下,代码将抛出onSuccess方法)此方法在onCreate中调用。
private void startSMSListening(){
SmsRetrieverClient client = SmsRetriever.getClient(this);
Task<Void> task = client.startSmsRetriever();
task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// Successfully started retriever, expect broadcast intent
Log.e("startSMSListening", "listening sms");
sendCode();
showHideLoadingView(false);
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Failed to start retriever, inspect Exception for more details
Log.e("startSMSListening", "failure listening sms");
showHideLoadingView(false);
}
});
}
我的接收者:
public class SmsReceiver extends BroadcastReceiver {
//interface
private static SmsListener mListener;
@Override
public void onReceive(Context context, Intent intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
Bundle extras = intent.getExtras();
if(extras != null) {
Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
if(status != null) {
switch (status.getStatusCode()) {
case CommonStatusCodes.SUCCESS:
// Get SMS message contents
String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
//Pass the message text to interface
if (mListener != null && !StringUtil.isNull(message)) {
mListener.messageReceived(message);
}
break;
case CommonStatusCodes.TIMEOUT:
Log.d("SMSReceiver", "timed out (5 minutes)");
break;
}
}
}
}
}
public static void bindListener(SmsListener listener) {
mListener = listener;
}
}
我的smsReceiver方法:
private void smsReceiver(){
SmsReceiver.bindListener(new SmsListener() {
@Override
public void messageReceived(String messageText) {
//From the received text string you may do string operations to get the required OTP
//It depends on your SMS format
Log.e("Message",messageText);
// If your OTP is six digits number, you may use the below code
Pattern pattern = Pattern.compile(OTP_REGEX);
Matcher matcher = pattern.matcher(messageText);
String otp = null;
while (matcher.find()) {
otp = matcher.group();
}
if(otp != null && et_code != null) {
et_code.setText(otp);
}
}
});
}
首先下载您的应用程序签名证书.der文件,然后通过此命令转换为.jks文件
keytool -import -alias your_alias -keystore file_name_created -file certificate.der
然后创建新的.jks文件
然后使用此命令为您的发布生成哈希
keytool -exportcert -alias your_alias -keystore certificate.jks | xxd -p | tr -d "[:space:]" | echo -n app_package_name `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
然后创建哈希字符串,它将适用于Play商店应用程序。
按照以下步骤获取生产密钥:
现在,当您运行命令以通过AppSignatureHelper Class获取哈希时,该键将成为您的生产密钥。
几天前,我遇到了同样的问题。实际上你的代码没有错。当您运行应用程序并创建哈希时,它仅为特定于设备创建哈希。当您生成签名apk并创建哈希(使用日志)时,此哈希仅用于发布但不用于生产。在生产的情况下,您必须从Play商店安装应用程序并检查哈希(使用日志),并且该哈希将用于所有用户。
希望它会对你有所帮助
您是否生成了相关散列值并通过服务器的短信发送?
keytool -import -alias your_alias -keystore file_name_created.keystore -file certificate.der
您必须将释放应用程序字符串哈希添加到从服务器发送的消息,因为发布散列与调试散列SMS retriever verify不同
我使用了同样的问题
SMSRETRIEVERAPI
我得到了调试构建的otp但是当我把它推到playstore时我不会自动读取otp。实际上它会根据你的应用程序构建变量type.So Inorder to auto read your otp you will change the your hashkey in your server that will be generated in release mode.
生成hashkey。
因此,在发布模式下找到Hashkey并在服务器中更新它。看来你会得到它。