16

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

我的问题是当我在 release Build Variant 中运行应用程序时,它不起作用。我收到了短信,但我无法读取登录代码。

我在发布模式下更改了AppSignatureHelper生成的哈希,这与调试模式不同。在调试工作和版本号中。

一些帮助将不胜感激

编码:

显现:

   <receiver android:name=".app.receivers.SmsReceiver">
        <intent-filter>
            <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>
        </intent-filter>
    </receiver>

在我的课程中:(在发布和调试模式下,代码会抛出 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);
        }
    });
}

我的接收器:

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);
                }
            }
        });
    }
4

8 回答 8

8

首先下载您的应用签名证书 .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 商店应用程序上运行。

于 2019-01-11T12:34:55.900 回答
6

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

  1. 转到构建选项。
  2. 在选项中,选择Select Build Variant
  3. 然后在左角,将打开一个对话框,从那里将 Build Variant 从debug更改为release
  4. 单击运行,然后将打开此对话框: 然后此对话框将打开(第 4 点图片。)
  5. 单击“运行”,然后单击“仍然继续”,然后在对话框中单击“在此对话框中单击左下角的 **+**” 。
  6. 然后填写这些详细信息:然后填写这些详细信息
  7. 现在转到构建类型并按照此图像进行操作:然后去构建类型并按照图像
  8. 然后点击确定

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

于 2019-02-26T07:14:35.113 回答
5

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

希望对你有帮助

您可以使用此链接创建 hashkey:

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

于 2019-02-04T19:23:27.790 回答
2
  1. 首先从您的游戏控制台帐户下载应用程序签名证书。
  2. 然后使用以下命令将其转换为带有密钥库扩展名的 yourkeystore.keystore:

    keytool -import -alias your_alias -keystore file_name_created.keystore -file certificate.der

  3. 然后使用创建的密钥库创建字符串哈希。
    使用此文件 bash 创建哈希字符串:
    https ://github.com/googlesamples/android-credentials/tree/master/sms-verification/bin

于 2019-02-07T15:39:07.590 回答
2

您必须将发布应用程序字符串哈希添加到从服务器发送的消息中,因为发布哈希不同于调试哈希 SMS 检索器验证

于 2019-04-17T14:18:12.047 回答
0

我建议您在生产环境中复制应用程序的 SHA-1 和 SHA-256,在 Release -> Setup -> App Signing 下。

然后转到您的firebase控制台,选择您的项目->项目设置,只需将SHA-1和SHA-256粘贴到“SHA证书指纹”下

给你,,,

于 2021-01-08T06:22:22.483 回答
0

我通过使用遇到了同样的问题

短信检索API

我得到了用于调试构建的 otp,但是当我将它推送到 playstore 时,我不会自动读取 otp。实际上,它会根据您的应用程序构建变体类型生成哈希键。So Inorder to auto read your otp you will change the your hashkey in your server that will be generated in release mode.

因此,在发布模式下找到 Hashkey 并在您的服务器中更新它。就是这样,您将得到它。

于 2019-05-06T08:00:32.653 回答
0

我在生产应用程序中遇到了同样的问题,哈希码本身不是罪魁祸首。确保它的长度为11 个字符。我在哈希码中有一个斜线,这让我很困惑。

前任:P/adbDKExdk

于 2021-02-01T08:15:47.863 回答