Android NDK开发详解应用数据和文件之访问共享数据集

Android NDK开发详解应用数据和文件之访问共享数据集

从 Android 11(API 级别 30)开始,系统会缓存可供多个应用访问的大型数据集,为机器学习和媒体播放等用例提供支持。此功能有助于减少网络中和磁盘上的数据冗余。

当您的应用需要访问大型共享数据集时,可以先查找是否有这类缓存的数据集(称为共享数据 blob),然后再决定是否下载新副本。应用可以通过 BlobStoreManager 中的 API 访问此共享数据集功能。

系统维护着共享数据 blob 并控制着哪些应用可以访问它们。当您的应用提供数据 blob 时,您可以通过调用以下方法之一指明应该对其具有访问权限的其他应用:

如需向设备上的一组特定应用授予访问权限,请将这些应用的软件包名称传递到 allowPackageAccess() 中。
要仅允许证书签名所用密钥与您的应用所用密钥相同的应用(例如您管理的应用套件),请调用 allowSameSignatureAccess()。
如需向设备上的所有应用授予访问权限,请调用 allowPublicAccess()。

访问共享数据 blob

系统使用 BlobHandle 对象表示每个共享数据 blob。每个 BlobHandle 实例都包含相应数据集的加密安全哈希值和一些识别性详细信息。

如需访问共享数据 blob,请从服务器下载识别性详细信息。使用这些详细信息检查系统上是否已存在相应数据集。

下一步取决于是否已存在相应数据。

已存在数据集

如果设备上已存在相应数据集,请从系统访问该数据集,如以下代码段所示:
Kotlin

val blobStoreManager =
        getSystemService(Context.BLOB_STORE_SERVICE) as BlobStoreManager
// The label "Sample photos" is visible to the user.
val blobHandle = BlobHandle.createWithSha256(sha256DigestBytes

,
        "Sample photos",
        System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1),
        "photoTrainingDataset")
try {
    val input = ParcelFileDescriptor.AutoCloseInputStream(
            blobStoreManager.openBlob(blobHandle))
    useDataset

(input)
}

Java

BlobStoreManager blobStoreManager =
        ((BlobStoreManager) getSystemService(Context.BLOB_STORE_SERVICE));
if (blobStoreManager != null) {
    // The label "Sample photos" is visible to the user.
    BlobHandle blobHandle = BlobHandle.createWithSha256(
            sha256DigestBytes

,
            "Sample photos",
            System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1),
            "photoTrainingDataset");
    try (InputStream input = new ParcelFileDescriptor.AutoCloseInputStream(
            blobStoreManager.openBlob(blobHandle))) {
        useDataset

(input);
    }
}

不存在数据集

如果不存在相应数据集,请从服务器下载该数据集并将其提供给系统,如以下代码段所示:
Kotlin

val sessionId = blobStoreManager.createSession(blobHandle)
try {
    val session = blobStoreManager.openSession(sessionId)
    try {
        // For this example, write 200 MiB at the beginning of the file.
        val output = ParcelFileDescriptor.AutoCloseOutputStream(
                session.openWrite(0, 1024 * 1024 * 200))
        writeDataset

(output)

        session.apply {
            allowSameSignatureAccess()
            allowPackageAccess(your-app-package

,
                    app-certificate

)
            allowPackageAccess(some-other-app-package

,
                    app-certificate

)
            commit(mainExecutor, callback

)
        }
    }
}

Java

long sessionId = blobStoreManager.createSession(blobHandle);
try (BlobStoreManager.Session session =
        blobStoreManager.openSession(sessionId)) {
    // For this example, write 200 MiB at the beginning of the file.
    try (OutputStream output = new ParcelFileDescriptor.AutoCloseOutputStream(
            session.openWrite(0, 1024 * 1024 * 200)))
        writeDataset

(output);
        session.allowSameSignatureAccess();
        session.allowPackageAccess(your-app-package

,
                    app-certificate

);
        session.allowPackageAccess(some-other-app-package

,
                    app-certificate

);
        session.commit(getMainExecutor(), callback

);
    }
}

本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。

最后更新时间 (UTC):2023-04-02。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值