Google SMS检索API不检索SMS消息

时间:2018-12-24 00:51:19

标签: android kotlin sms

我正在尝试使用Google的SMS检索器API进行自动SMS验证。我遵循了here的指示,但是我的应用未收到任何短信。这是我所做的:

我已经在活动中添加了代码以启动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分钟发送超时事件时触发。它永远不会触发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 验证哈希:“

知道我在做什么错吗?

6 个答案:

答案 0 :(得分:3)

也许您的邮件的结构错误,请检查以下链接:SMS Retriever API。首先,您的短信必须以<#>或[#]开头。并且在第4点,您的短信必须为“以11个字符的哈希字符串结尾,以标识您的应用”

我有同样的问题,这就是我的意识,请在开头添加<#>并在末尾添加哈希字符串来解决。

答案 1 :(得分:0)

您到目前为止所做的一切都是完美的,只需在您的活动中添加以下内容,它就对我有用...........

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(SmsRetriever.SMS_RETRIEVED_ACTION);

getApplicationContext()。registerReceiver(smsBroadcast,intentFilter);

答案 2 :(得分:0)

我以相同的方式进行操作,并且对我来说非常有效。 您的应用程序哈希很可能是错误的。

答案 3 :(得分:0)

我最近遇到了同样的问题。

我发现问题是我正在使用生产的Keystore哈希在调试模式下进行测试。

如果您以调试模式运行,请确保使用用于签名调试apk的默认密钥库。

默认调试密钥库位置为$HOME/.android/debug.keystore

按照app-sign documentation

  

从IDE,Android Studio运行或调试项目时   使用由生成的调试证书自动对您的应用进行签名   Android SDK工具。第一次在其中运行或调试项目   在Android Studio中,IDE会自动创建调试密钥库,然后   $ HOME / .android / debug.keystore中的证书,并设置密钥库   和密钥密码。

我最近写了一篇关于check it out for more details的博客文章。

答案 4 :(得分:0)

在SmsRetrievers addOnSuccessListener 回调方法中注册BroadcastReceiver,请勿在 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()
    }

答案 5 :(得分:0)

当我尝试使其工作时遇到了两个问题:

1)SMS消息的格式必须正确。您可能会认为“好吧,我明白了”,但就我而言,我在SMS的第一行和签名哈希键之间有多个换行符。确保严格遵循以下模式:

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

2)确保使用正确的哈希键。除非您在SMS消息中的签名哈希与正在运行的应用中的签名哈希匹配,否则Android不会调用onReceive方法。我为什么这么说呢?您的本地调试版本和存储中部署的版本将具有不同的哈希值。这里要提到的一点是,将apk上传到Google控制台后,Google可以为您接管签名部分。

希望这对您有帮助...我的两天都浪费了。