如何在 Android 中将 GoogleAPIClient(已弃用)与 SMSRetriver API 一起使用

Dev*_*rma 17 android google-api google-api-client googlesigninapi sms-retriever-api

我正在尝试实现 SMS Retriever API 以进行 SMS 验证。文档中提到的官方方式说GoogleApiClientHintRequest从设备检索手机号码一起使用

HintRequest hintRequest = new HintRequest.Builder()
            .setPhoneNumberIdentifierSupported(true)
            .build();

PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(
            googleApiClient, hintRequest);
try {
    startIntentSenderForResult(intent.getIntentSender(),
                RESOLVE_HINT, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

但是GoogleAPIClient已弃用并由GoogleApi接口代替,例如GoogleSignInClient. 我尝试使用GoogleSignInClientgetHintPickerIntent不接受。即使在被弃用后使用旧 API 是否安全,或者有没有办法将后者与 SMSRetriver API 一起使用?

Chr*_*ull 30

要删除已弃用的GoogleApiClient,请将您的意图替换为以下内容:

// Kotlin
val intent = Credentials.getClient(this).getHintPickerIntent(hintRequest)
Run Code Online (Sandbox Code Playgroud)
// Java
PendingIntent intent = Credentials.getClient(this).getHintPickerIntent(hintRequest);
Run Code Online (Sandbox Code Playgroud)

Credentials在这个包中找到:com.google.android.gms.auth.api.credentials.Credentials


buttonClicked按下按钮时调用的完整工作示例:

// Kotlin

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.auth.api.credentials.Credential
import com.google.android.gms.auth.api.credentials.Credentials
import com.google.android.gms.auth.api.credentials.CredentialsApi
import com.google.android.gms.auth.api.credentials.HintRequest

class MyActivity : AppCompatActivity() {

    // ... onCreate Functions, etc

    // Arbitrary number to identify the request for crednetials
    private val iRequestCodePhoneNumber = 100

    // Button click listener
    fun buttonClicked(@Suppress("UNUSED_PARAMETER") view: View) {
        val hintRequest = HintRequest.Builder()
            .setPhoneNumberIdentifierSupported(true)
            .build()

        val intent = Credentials.getClient(this).getHintPickerIntent(hintRequest)

        startIntentSenderForResult(
            intent.intentSender,
            iRequestCodePhoneNumber, null, 0, 0, 0
        )
    }

    // Parse the result of the HintPicker (i.e., get the selected phone number)
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        // resultCode:
        //   Activity.RESULT_OK (-1) = number selected
        //   Activity.RESULT_CANCELED (0) = user touched outside the HintPicker (do nothing)
        //   CredentialsApi.ACTIVITY_RESULT_OTHER_ACCOUNT (1001) = "None of the above" (do nothing; treat as same use case as 'Cancelling')
        //   CredentialsApi.ACTIVITY_RESULT_NO_HINTS_AVAILABLE (1002) = no numbers found, probably no SIM card
        if (requestCode == iRequestCodePhoneNumber && resultCode == Activity.RESULT_OK) {
            val credential: Credential? = data?.getParcelableExtra(Credential.EXTRA_KEY)
            val phoneNumber = credential?.id

            // *** Do something with the phone number here ***

        } else if (
            requestCode == iRequestCodePhoneNumber &&
            resultCode == CredentialsApi.ACTIVITY_RESULT_NO_HINTS_AVAILABLE
        ) {
            // *** No phone numbers available ***
            Toast.makeText(this, "No phone numbers found", Toast.LENGTH_LONG).show()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将生成一个像这样的弹出窗口:

用户选择其设备上可用的电话号码

  • 我对任何遇到这个答案的人表示同情,因为从已弃用的“GoogleApiClient”迁移的文档非常糟糕(没有为旧/新类或技术提供映射)。希望这对某人有帮助。 (8认同)
  • 由于某种原因,在真实设备上,新代码给我“ApiException:16:在此设备上找不到电话号码”,而旧代码工作正常。而且,在模拟器上,情况恰恰相反(旧的不起作用,新的可以正常工作)。怎么会?我在这里报告了这一点:https://issuetracker.google.com/issues/266967506 (2认同)