web-dev-qa-db-ja.com

Google SMS Retriever API not retrieving SMSメッセージ

GoogleのSMS自動取得用のRetriever APIを使用しようとしていますSMS検証。指示に従いました こちら ですが、私のアプリはSMSメッセージを受信して​​いません。これが私がやったことです:

SMSレトリーバークライアントを開始するために、アクティビティにコードを追加しました:

    val client = SmsRetriever.getClient(this)
    val retriever = client.startSmsRetriever()
    retriever.addOnSuccessListener {
        Log.i("loginActivity", "started smsretriever")
    }

    retriever.addOnFailureListener {
        //Problem to start listener
    }

ログから、これが正常に開始することがわかります。次に、このonReceiveを使用してブロードキャストレシーバーを追加します。

override fun onReceive(context: Context, intent: Intent) {
    if (SmsRetriever.SMS_RETRIEVED_ACTION == intent.action) {
        val extras = intent.extras
        val status = extras.get(SmsRetriever.EXTRA_STATUS) as Status

        when (status.statusCode) {
            CommonStatusCodes.SUCCESS -> {

            }
            CommonStatusCodes.TIMEOUT -> {

            }
    }
}

これは、SMS取得クライアントが起動してから5分後にTIMEOUTイベントが送信されたときにのみトリガーされます。SMSメッセージに対してトリガーされることはありません。

最後に、マニフェストにレシーバーを登録しました。

<receiver Android:name=".receiver.SMSReceiver" Android:exported="true">
        <intent-filter>
            <action Android:name="com.google.Android.gms.auth.api.phone.SMS_RETRIEVED"/>
        </intent-filter>
    </receiver>

テキストメッセージに関して、私はこれを自分に送信していますSMSメッセージ: "<#>あなたのコードは:123456検証ハッシュ:"

私が間違っていることは何か考えていますか?

5
sadelbrid

BroadcastReceiverをSmsRetrievers addOnSuccessListenerコールバックメソッド内に登録します。Manifestファイルには登録しないでください。

val client = SmsRetriever.getClient(this)
        val retriever = client.startSmsRetriever()
        retriever.addOnSuccessListener {
            val listener = object : SMSBroadcastReceiver.Listener {
                override fun onSMSReceived(otp: String) {
                    Log.d("AppSignatureHelper",otp)
                    Toast.makeText(context, otp, Toast.LENGTH_SHORT).show()
                }

                override fun onTimeOut() {
                    Log.d("AppSignatureHelper","Timed Out.")
                }
            }
            smsBroadcastReceiver.injectListener(listener)
            registerReceiver(smsBroadcastReceiver, IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION))
        }
        retriever.addOnFailureListener {
            Log.d("AppSignatureHelper","Problem to start listener")
            //Problem to start listener
        }

リスナーインターフェースはそうです。

 interface Listener {
        fun onSMSReceived(otp: String)
        fun onTimeOut()
    }
1
deepak raj

最近同じ問題に直面しました。

私は、デバッグモードでテストするために本番のキーストアハッシュを使用していたことが問題だとわかりました。

デバッグモードで実行している場合は、必ずデバッグAPKの署名に使用されるデフォルトのキーストアを使用してください。

デフォルトのデバッグキーストアの場所は$HOME/.Android/debug.keystore

app-sign documentation に従って:

IDEからプロジェクトを実行またはデバッグするとき、Android Studioは、Android SDKツールによって生成されたデバッグ証明書を使用してアプリに自動的に署名します。初めて実行するときまたはAndroid Studio、IDE=でプロジェクトをデバッグすると、$ HOME/.Android/debug.keystoreにデバッグキーストアと証明書が自動的に作成され、キーストアが設定されますおよび主要なパスワード。

私は最近これについてブログ投稿を書きました 詳細はこちらをご覧ください

0
Wilder Pereira

私も同じようにして、完全にうまくいきました。アプリケーションハッシュが間違っている可能性があります。

0
Fat Cat

これを機能させようとしたときに直面した2つの問題:

1)SMSメッセージは適切にフォーマットされている必要があります。 「大丈夫、わかった」と思うかもしれませんが、私の場合、SMSの最初の行と署名ハッシュキーの間に複数の改行がありました。このパターンに厳密に従っていることを確認してください。

<#> Your xy verification code is 123456
FA+9qCX9VSu

2)正しいハッシュキーを使用していることを確認してください。 Androidは、SMSメッセージ内の署名ハッシュが実行中のアプリのハッシュと一致しない限り、onReceiveメソッドを呼び出しません。なぜ私はこれを言うのですか?ローカルデバッグバージョンとストアにデプロイされたバージョンには異なるハッシュがあります。ここで言及すべき1つの点は、APKをGoogleコンソールにアップロードすると、Googleが署名部分を引き継ぐことができるということです。

これがお役に立てば幸いです...私の2日間は無駄になっています。

0
thomasgalliker