首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google SMS Retriever API不检索SMS消息

Google SMS Retriever API不检索SMS消息
EN

Stack Overflow用户
提问于 2018-12-24 08:51:19
回答 7查看 11.3K关注 0票数 9

我正在尝试使用Google的SMS Retriever API进行自动短信验证。我已经按照方向here,但我的应用程序没有收到任何短信。下面是我所做的:

我已经在我的活动中添加了启动SMS检索器客户端的代码:

代码语言:javascript
复制
    val client = SmsRetriever.getClient(this)
    val retriever = client.startSmsRetriever()
    retriever.addOnSuccessListener {
        Log.i("loginActivity", "started smsretriever")
    }

    retriever.addOnFailureListener {
        //Problem to start listener
    }

从日志中,我看到这已成功启动。然后我用这个onReceive添加我的广播接收器:

代码语言:javascript
复制
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分钟后发送超时事件时触发。它永远不会触发短信。

最后,我在清单中注册了接收者:

代码语言:javascript
复制
<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>

在短信方面,我给自己发了这样一条短信:"<#>你的密码是: 123456验证散列:“

知道我做错了什么吗?

EN

回答 7

Stack Overflow用户

发布于 2019-03-06 15:04:21

也许你的消息有错误的结构,请检查此链接:SMS Retriever API。在第一点,您的文本消息必须以<#>或#开头。在第4点,你的文本消息必须是-“以11个字符的散列字符串结束,以识别你的应用程序”

我也有同样的问题,这一点是我的意识,通过在开头添加<#>和在结尾添加散列字符串来解决。

票数 8
EN

Stack Overflow用户

发布于 2019-03-27 18:18:19

在SmsRetrievers addOnSuccessListener回调方法中注册BroadcastReceiver,不要在清单文件中注册。

代码语言:javascript
复制
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
        }

侦听器接口是。

代码语言:javascript
复制
 interface Listener {
        fun onSMSReceived(otp: String)
        fun onTimeOut()
    }
票数 3
EN

Stack Overflow用户

发布于 2019-12-17 17:31:08

当我试图让它工作时,我遇到了两个问题:

1)短信需要格式规范。你可能会想‘好的,我知道了’,但在我的例子中,在SMS的第一行和签名散列密钥之间有不止一个换行符。确保严格遵循以下模式:

代码语言:javascript
复制
<#> Your xy verification code is 123456
FA+9qCX9VSu

2)确保使用正确的哈希键。安卓不会调用onReceive方法,除非你在短信中的签名散列与正在运行的应用程序中的签名散列匹配。我为什么这么说?您的本地调试版本和存储区中部署的版本将具有不同的哈希。这里要提到的一点是,一旦你将apk上传到谷歌控制台,谷歌就可以接管你的签名部分。

希望这能帮到你。我的两天已经浪费了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53908267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档