Credential Manager - Holder API 使 Android 应用能够管理数字凭据并将其呈现给验证方。
开始使用
如需使用 Credential Manager - Holder API,请将以下依赖项添加到应用模块的 build 脚本中:
// In your app module's build.gradle:
dependencies {
implementation(libs.androidx.registry.provider)
implementation(libs.androidx.registry.provider.play.services)
}
// In libs.versions.toml:
registryDigitalCredentials = "1.0.0-alpha01"
androidx-registry-provider = { module = "androidx.credentials.registry:registry-provider", version.ref = "registryDigitalCredentials" }
androidx-registry-provider-play-services = { module = "androidx.credentials.registry:registry-provider-play-services", version.ref = "registryDigitalCredentials" }
使用 Credential Manager 注册凭据
钱包需要注册凭据元数据,以便 Credential Manager 在收到请求时过滤这些元数据并将其显示在凭据选择器中。

Credential Manager 选择器界面
此元数据的格式会传递到 RegisterCredentialsRequest
中。创建 [RegistryManager][1]
并注册凭据:
在此示例中,元数据是从凭据条目的数据库编译而成的。您可以在我们的示例钱包中找到相关参考信息,该钱包会在应用加载时注册元数据。未来,Jetpack API 将支持凭据数据库组合。届时,您还可以将凭据元数据注册为明确定义的数据结构。
注册表会在设备重新启动时保留。重新注册同一 ID 和类型的同一注册信息会覆盖之前的注册记录。因此,只有在凭据数据发生变化时,您才需要重新注册。
可选:创建匹配器
凭据管理器与协议无关;它将元数据注册表视为不透明的 Blob,并且不会验证或检查其内容。因此,钱包必须提供匹配器,即一个可执行的二进制文件,该文件可以处理钱包自己的数据,并根据传入的请求生成显示元数据。凭据管理器将在没有网络或磁盘访问权限的沙盒环境中运行匹配器,以便在向用户呈现界面之前,不会有任何内容泄露到钱包中。
Credential Manager API 将为热门协议(目前为 OpenID4VP)提供匹配器。该功能尚未正式发布,因此目前请使用我们的 OpenID4VP 协议示例匹配器。
处理所选凭据
接下来,钱包需要处理用户选择凭据的情况。您可以定义一个监听 androidx.credentials.registry.provider.action.GET_CREDENTIAL
intent 过滤器的 activity。我们的示例钱包演示了此过程。
启动 activity 的 intent 将包含验证方请求和调用来源,这些信息可通过 PendingIntentHandler.retrieveProviderGetCredentialRequest
函数提取。该 API 会返回一个 ProviderGetCredentialRequest
,其中包含与指定验证器请求关联的所有信息。主要包含三个关键组件:
- 发出请求的应用。您可以使用
getCallingAppInfo
检索此信息。 - 所选凭据。您可以通过
selectedEntryId
扩展方法获取有关用户选择哪个候选凭据的信息;这会与您注册的凭据 ID 相匹配。 - 验证者提出的任何具体要求。您可以通过
getCredentialOptions
方法获取此信息。在这种情况下,您应该会在此列表中找到一个包含数字凭证请求的GetDigitalCredentialOption
。
最常见的情况是,验证方会发出数字凭证出示请求,因此您可以使用以下示例代码来处理该请求:
request.credentialOptions.forEach { option ->
if (option is GetDigitalCredentialOption) {
Log.i(TAG, "Got DC request: ${option.requestJson}")
processRequest(option.requestJson)
}
}
您可以在我们的示例钱包中查看相关示例。
呈现钱包界面
选择凭据后,系统会调用钱包并引导用户完成钱包界面中的操作。在示例中,这是一个生物识别提示。
返回凭据响应
钱包准备好发送结果后,您可以通过完成包含凭据响应的 activity 来发送结果:
PendingIntentHandler.setGetCredentialResponse(
resultData,
GetCredentialResponse(DigitalCredential(response.responseJson))
)
setResult(RESULT_OK, resultData)
finish()
如果存在例外情况,您可以同样发送凭据例外情况:
PendingIntentHandler.setGetCredentialException(
resultData,
GetCredentialUnknownException() // Configure the proper exception
)
setResult(RESULT_OK, resultData)
finish()
如需查看如何在上下文中返回凭据响应的示例,请参阅示例应用。