借助 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 和类型的同一注册表将覆盖之前的注册表记录。因此,您只需在凭据数据发生变化时重新注册。
可选:创建匹配器
Credential Manager 不依赖于协议;它会将元数据注册表视为不透明的 Blob,不会验证或检查其内容。因此,钱包必须提供匹配器,即可处理钱包自己的数据并根据传入请求生成显示元数据的可运行二进制文件。Credential Manager 将在没有网络或磁盘访问权限的沙盒环境中运行匹配器,以便在向用户呈现界面之前,不会将任何内容泄露到钱包。
Credential Manager API 将为热门协议(目前为 OpenID4VP)提供匹配器。该工具尚未正式发布,因此目前请针对 OpenID4VP v24 协议使用我们的示例匹配器。
处理所选凭据
接下来,当用户选择凭据时,钱包需要进行处理。您可以定义一个监听 androidx.credentials.registry.provider.action.GET_CREDENTIAL
intent 过滤器的 activity。我们的示例钱包演示了此过程。
启动 activity 的 intent 将包含 Verifier 请求和调用来源,您可以使用 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()
如需查看如何在上下文中返回凭据响应的示例,请参阅示例应用。