【问题标题】:How to use GoogleAPIClient (deprecated) with SMSRetriver API in Android如何在 Android 中将 GoogleAPIClient(已弃用)与 SMSRetriver API 一起使用
【发布时间】:2020-06-26 14:57:29
【问题描述】:

我正在尝试实施 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。我尝试使用GoogleSignInClient,但getHintPickerIntent 不接受。即使在被弃用后使用旧 API 是否安全,还是有办法将后者与 SMSRetriver API 一起使用?

【问题讨论】:

    标签: android google-api google-api-client google-signin sms-retriever-api


    【解决方案1】:

    要删除已弃用的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()
            }
        }
    }
    

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

    【讨论】:

    • 我对任何绊倒这个答案的人表示同情,因为从已弃用的GoogleApiClients 迁移的文档非常差(没有为旧/新类或技术提供映射)。希望这对某人有所帮助。
    • 谢谢你,克里斯托弗!它运作良好。关于文档,我完全同意你的看法。
    • 感谢您的分享,希望我能多投赞成票。
    • 谁能告诉我们应该在函数buttonClicked(View view)视图位置传递什么,如果我在java中使用它
    • 你不应该直接打电话给buttonClicked(View view)。在 XML 布局文件中,选择一个 Button(它是 View 的子类)并将其 onclick 事件侦听器设置为“buttonClicked”。如果操作正确,Android Studio 应该会自动建议可用的方法。
    【解决方案2】:

    当您想请求电话号码提示时,请使用此函数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());
    }
    

    在这里,我们使用 this 来处理结果(之前,我们使用 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);
            }
    });
    

    【讨论】:

    • 应用您的代码后,我的课堂上没有任何贬值代码,谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2016-05-11
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多