web-dev-qa-db-ja.com

SMS Retriever APIがリリースモードで機能しないのはなぜですか?

GoogleチュートリアルやデバッグビルドバリアントのようにSMS Retriever APIを実装しました。私はSMSを読むことができ、ログインを行うことができるユーザーにコードを取得できます。

私の問題は、ビルドバリアントのリリースでアプリを実行すると、SMSが機能しないことです。 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>

私のクラスでは:(リリースおよびデバッグモードでは、コードは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);
                }
            }
        });
    }
10
S.P.

以下の手順に従って、本番用のキーを取得します。

  1. Buildオプションに移動します。
  2. オプションで、Select Variant Variantを選択します。
  3. 次に、左隅にダイアログが開き、そこからビルドバリアントをdebugからrelease
  4. 実行をクリックすると、このダイアログが開きます: Then this dialog will open(point 4 pic.)
  5. Runをクリックし、次にContinue Anywayをクリックしてからはいそしてダイアログで In this dialog Click on the **+** in left bottom
  6. 次に、これらの詳細を入力します。 Then fill these details
  7. 次に、Build Typesに移動し、この画像に従います。 Then go to build types and follow the image
  8. そして、okをクリックします。

コマンドを実行して AppSignatureHelper Class でハッシュを取得すると、そのキーがプロダクションキーになります。

4

最初にアプリ署名証明書の.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ストアアプリで機能します。

3
Pankaj Jain

数日前、私は同じ問題を抱えていました。実際、コードには何も問題はありません。アプリを実行してハッシュを作成すると、デバイス固有のハッシュのみが作成されます。署名付きapkを生成して(logを使用して)ハッシュを作成する場合、このハッシュはリリース専用であり、実稼働用ではありません。本番の場合、Play Storeからアプリをインストールし、(ログを使用して)ハッシュをチェックする必要があり、そのハッシュはすべてのユーザーに使用されます。

それがあなたを助けることを願っています

2
Arsalan Khan
  1. まず、Playコンソールアカウントからアプリ署名証明書をダウンロードします。
  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

1
aiman absi

私は同じ問題を抱えていました

SMSRETRIEVERAPI

デバッグビルド用の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を見つけて、サーバーで更新します。

0
venu46

リリースハッシュはデバッグハッシュとは異なるため、サーバーから送信されたメッセージにリリースアプリの文字列ハッシュを追加する必要があります SMS retriever verify

0
Muhammad Helmi

新しいハッシュ値を生成し、サーバーからSMS経由で送信しましたか?

0
Chintan Desai