为什么SMS Retriever API在发布模式下不起作用?

S.P*_*.P. 10 android android-intent android-broadcast android-broadcastreceiver android-sms

我已经SMS Retriever API在谷歌教程和我的调试Build Variant工作中实现了类似的工作.我可以读取短信并获取用户可以登录的代码.

我的问题是,当我在发布版本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>
Run Code Online (Sandbox Code Playgroud)

在我的类中:(在发布和调试模式下,代码将抛出onSucess方法)此方法在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);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我的接收者:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的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);
                }
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

Pan*_*ain 7

首先下载您的应用签名证书 .der 文件,然后通过此命令转换为 .jks 文件

keytool -import -alias your_alias -keystore file_name_created -file certificate.der
Run Code Online (Sandbox Code Playgroud)

然后创建了新的 .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
Run Code Online (Sandbox Code Playgroud)

然后创建哈希字符串,它将在 Play 商店应用程序上运行。

  • 'xxd' 不是内部或外部命令,也不是可运行的程序或批处理文件。 (3认同)

Ers*_*han 5

几天前,我遇到了同样的问题。实际上,您的代码没有任何问题。当您运行您的应用程序并创建哈希时,它仅为特定于设备创建哈希。当您生成签名的 apk 并创建哈希(使用 log )时,此哈希仅用于发布而不用于生产。在生产的情况下,您必须从 Play 商店安装应用程序并检查哈希(使用日志),该哈希将用于所有用户。

希望它会帮助你

您可以使用此链接创建哈希键:

https://github.com/arsalankhan994/AppSignatureHelper/tree/main


Suj*_*eet 5

请按照以下步骤获取生产密钥:

  1. 转到“ 生成”选项。
  2. 在选项中,选择选择构建变式
  3. 然后在左上角,将打开一个对话框,从此处将Build Variant从debug更改为release
  4. 单击运行,然后将打开以下对话框: 然后将打开此对话框(点4图片。)
  5. 单击运行,然后单击仍然继续,然后单击是,然后在对话框中在此对话框中,单击左下方的** + **
  6. 然后填写以下详细信息: 然后填写这些详细信息
  7. 现在转到“ 构建类型”并遵循以下图像:然后去建立类型并跟随图像
  8. 然后单击确定

现在,当您运行命令以通过AppSignatureHelper Class获取哈希时,该密钥将成为您的生产密钥。