在处理 "androidx.credentials.exceptions.GetCredentialCancellationException: 用户取消了活动" 异常时,可以使用以下代码示例来解决问题:
import androidx.appcompat.app.AppCompatActivity;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import androidx.credential.provider.Credential;
import androidx.credential.provider.CredentialClient;
import android.Manifest;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final int PERMISSION_REQUEST_CODE = 1;
private static final String[] REQUIRED_PERMISSIONS = {Manifest.permission.GET_ACCOUNTS};
private CredentialClient mCredentialClient;
private ActivityResultLauncher requestPermissionLauncher = registerForActivityResult(
new ActivityResultContracts.RequestPermission(),
isGranted -> {
if (isGranted) {
// 用户授予了权限,可以继续获取凭据
getCredential();
} else {
// 用户未授予权限,显示一个提示对话框或执行其他操作
showPermissionDeniedDialog();
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCredentialClient = new CredentialClient(this);
checkPermissions();
}
private void checkPermissions() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.GET_ACCOUNTS)
!= PackageManager.PERMISSION_GRANTED) {
// 如果没有获取到权限,则请求权限
requestPermissionLauncher.launch(Manifest.permission.GET_ACCOUNTS);
} else {
// 已经获取到权限,可以继续获取凭据
getCredential();
}
}
private void getCredential() {
mCredentialClient.request(new CredentialRequestOptions.Builder().build(),
new CredentialClient.OnCredentialRetrievedCallback() {
@Override
public void onCredentialRetrieved(@Nullable Credential credential) {
// 在此处理获取到的凭据
if (credential != null) {
// 已获取到凭据
String username = credential.getId();
String password = credential.getPassword();
// 使用凭据执行其他操作
} else {
// 未获取到凭据
}
}
@Override
public void onCredentialRequestFailure(@NonNull Exception e) {
if (e instanceof GetCredentialCancellationException) {
// 用户取消了活动,可以执行相应操作,如显示一个提示或返回上一个界面
showCancellationDialog();
} else {
// 其他凭据请求失败的情况
Toast.makeText(MainActivity.this, "Credential request failed: " + e.getMessage(),
Toast.LENGTH_SHORT).show();
}
}
});
}
private void showCancellationDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("操作取消");
builder.setMessage("用户取消了活动。");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 执行相应操作,如返回上一个界面
finish();
}
});
builder.show();
}
private void showPermissionDeniedDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("权限被拒绝");
builder.setMessage("无法获取账户凭据,请授予应用程序获取账户的权限。");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 执行相应操作,如关闭应用程序
finish();
}
});
builder.show();
}
}
这个代码示例中,首先检查是否已获取 GET_ACCOUNTS 权限,如果没有则请求权限。然后,使用 CredentialClient 请求凭据。如果用户取消了活动,则会抛出 GetCredentialCancellationException 异常,通过在 onCredentialRequestFailure 方法中判断异常类型,可以执行相应的操作,如显示一个对话框提示用户取消了活动。同时,还提供了一个方法 showPermissionDeniedDialog 显示权限被拒绝的对话框,提示用户授予应用程序获取账户的权限。
上一篇:Androidx.core1.6.0报错:无法访问“kotlin.Lazy”
下一篇:androidx.emoji2:emoji2:1.2.0aar包中的libs目录下的repackaged.jar的目的是什么?