android - SMS Retriever API android系统无法向广播接收器发送消息

标签 android kotlin sms

我一直在尝试实现 SMS Retriever API 以从手机上的服务器收集传入的短信,显然,当手机收到短信时,广播监听器上的 onReceive() 永远不会被调用。

客户端实现如下所述。

    private fun startSMSListener() {
    Log.d(TAG, "startSMSListener():")

    val client = SmsRetriever.getClient(this)
    val retriever = client.startSmsRetriever()
    retriever.addOnSuccessListener {

        Toast.makeText(this@MainActivity,"Listener started", Toast.LENGTH_SHORT).show()

        val otpListener = object : SMSBroadcastReceiver.OTPListener {
            override fun onOTPReceived(otp: String) {
                Log.d(TAG, "onOTPReceived(): $otp")
                tv_hash_code.text = otp
                Toast.makeText(this@MainActivity, otp , Toast.LENGTH_LONG).show()
            }

            override fun onOTPTimeOut() {
                Log.d(TAG, "onOTPTimeOut():")
                Toast.makeText(this@MainActivity,"TimeOut", Toast.LENGTH_SHORT).show()
            }
        }
        //smsBroadcastReceiver this is already initialized 
        smsBroadcastReceiver.injectOTPListener(otpListener)
        registerReceiver(smsBroadcastReceiver,
            IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION))
    }
    retriever.addOnFailureListener {
        Toast.makeText(this@MainActivity,"Problem to start listener", Toast.LENGTH_SHORT).show()
    }
}

广播接收者是

class SMSBroadcastReceiver : BroadcastReceiver() {


private var otpReceiver: OTPListener? = null

fun injectOTPListener(receiver: OTPListener?) {
    Log.d(TAG, "injectOTPListener is empty : ${receiver == null}")
    this.otpReceiver = receiver
}

override fun onReceive(context: Context, intent: Intent) {
    Log.d(TAG, intent.action)
    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 -> {
                Log.d(TAG, "CommonStatusCodes.SUCCESS")
                Toast.makeText(context, "CommonStatusCodes.SUCCESS", Toast.LENGTH_LONG).show()

                val message = extras.get(SmsRetriever.EXTRA_SMS_MESSAGE) as String

                val pattern = Pattern.compile("\\d{6}")
                val matcher = pattern.matcher(message)

                if (matcher.find()) {
                    otpReceiver?.onOTPReceived(matcher.group(0))
                    return
                }
            }
            CommonStatusCodes.TIMEOUT -> {
                Log.d(TAG, "CommonStatusCodes.TIMEOUT")
                Toast.makeText(context, "CommonStatusCodes.TIMEOUT", Toast.LENGTH_LONG).show()
                otpReceiver?.onOTPTimeOut()
            }
        }
    }
}

interface OTPListener {


    fun onOTPReceived(otp: String)

    fun onOTPTimeOut()
}
}

服务器实现

这是我的消息

<#> Your SmsVerificationCOde code is: 123456
wPMABADKiiS

这个哈希码是使用调试 key 生成的,我尝试了三种不同的方法来生成哈希码,它们都提供相同的值。

  1. key 工具

    keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass 安卓 | xxd-p | tr -d "[:空格:]"| echo -n com.example.smsverificationcode | sha256sum | tr -d "[:space:]-"| xxd -r -p | base64 |剪切-c1-11

  2. Script

    ./sms_retriever_hash_v9.sh --package "com.example.smsverificationcode"--keystore ~/.android/debug.keystore

  3. AppSignatureHelper

它们似乎都提供了相同的散列码,这让我相信散列码是正确的(我以任何方式尝试了发布类型,所有方法都为我提供了另一个“值”,这对所有方法都是相同的评价)

引用: https://developers.google.com/identity/sms-retriever/verify https://medium.com/@wilderpereira/secure-android-otp-account-verification-with-the-sms-retriever-api-c395c1985fbf

我确信客户端实现是正确的,因为我在 5 分钟后收到超时错误,但在短信到达时实际上没有收到任何信息。

我认为 Android 系统无法根据哈希码识别出我的应用程序,或者我的消息格式可能是错误的。

请看一下并纠正我可能错的地方。任何帮助都受到高度重视。

最佳答案

必须在全局广播 list 中注册广播接收器。 SMS_RETRIEVER 是一个全局广播。在这种情况下,您的广播接收器不能是动态的。

请查看以下链接以获取您正在寻找的解决方案:https://medium.com/@wilderpereira/secure-android-otp-account-verification-with-the-sms-retriever-api-c395c1985fbf

关于android - SMS Retriever API android系统无法向广播接收器发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55301892/

相关文章:

Java 或 Kotlin - 创建尽可能多的子列表

android - 使用 gluon 移动插件在开发 JavaFX 移动应用程序时进行调试

android-studio - Android Studio代码编辑器发生无法读取的代码意外

android - 使用 Gradle 覆盖库项目 list 中的 applicatoinID

java - Kotlin - 调用 getter 时未加载 HibernateProxy

c++ - 如何使用软件程序(如yahoo messenger)向手机发送短信?

android - 无法捕获使用 android.provider.Telephony.SMS_RECEIVED 收到的短信

java - 读取并显示传入的消息文本android

android - SQLiteOpenHelper.setWriteAheadLoggingEnabled 导致错误日志行

android - ExpandableListView 扩展至其他布局