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

How to use GoogleAPIClient (deprecated) with SMSRetriver API in Android

我正在尝试实施 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();
}

而是GoogleAPIClient is deprecated and replaced by GoogleApi interface,比如GoogleSignInClient。我尝试使用 GoogleSignInClientgetHintPickerIntent 不接受它。使用旧的 API 即使在被弃用后是否安全,或者有没有办法将后者与 SMSRetriver API 一起使用?

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

// Kotlin
val intent = Credentials.getClient(this).getHintPickerIntent(hintRequest)
// Java
PendingIntent intent = Credentials.getClient(this).getHintPickerIntent(hintRequest);

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()
        }
    }
}

这将生成如下弹出窗口:

当您想要请求 phone 号码提示时,请使用此函数 requestHint()

private void requestHint() {
    HintRequest hintRequest = new HintRequest.Builder()
            .setPhoneNumberIdentifierSupported(true)
            .build();
    PendingIntent intent = Credentials.getClient(this).getHintPickerIntent(hintRequest);
    IntentSenderRequest.Builder intentSenderRequest = new IntentSenderRequest.Builder(intent.getIntentSender());
    hintLauncher.launch(intentSenderRequest.build());
}

在这里,我们使用它来处理结果(之前,我们为此使用了 onActivityResult())。

ActivityResultLauncher<IntentSenderRequest> hintLauncher = registerForActivityResult(new ActivityResultContracts.StartIntentSenderForResult(),
    result -> {
        if(result!=null && result.getData()!=null){
                Intent data = result.getData();
                Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
                String phoneNum = credential.getId();
                if (phoneNum.contains("+91"))
                    phoneNum = phoneNum.replace("+91", "");
                mPhoneEditText.setText(phoneNum);
        }
});