存取共用資料集
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
自 Android 11 (API 級別 30) 起,系統會快取多個應用程式可能會存取的大型資料集,例如機器學習和媒體播放。這項功能有助於減少網路和磁碟上的資料備援。
如果應用程式需要存取共用的大型資料集,可以先查看這些快取資料集 (稱為共用資料 blob),再決定是否要下載新副本。應用程式可透過 BlobStoreManager
中的 API,存取這些共用資料集功能。
系統會維護共用資料 blob,並控管哪些應用程式可以存取。應用程式提供資料 blob 時,您可以呼叫下列任一方法,來表明哪些應用程式應具備存取權:
存取共用資料 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 和/或其關係企業的商標或註冊商標。
上次更新時間:2025-08-21 (世界標準時間)。
[null,null,["上次更新時間:2025-08-21 (世界標準時間)。"],[],[],null,["Starting in Android 11 (API level 30), the system caches large datasets that\nmultiple apps might access for use cases like machine learning and media\nplayback. This functionality helps reduce data redundancy, both over the network\nand on disk.\n\nWhen your app needs access to a shared large dataset, it can first look for\nthese cached datasets, called *shared data blobs* , before determining whether to\ndownload a new copy. Apps can access these shared datasets functionality using\nthe APIs in [`BlobStoreManager`](/reference/android/app/blob/BlobStoreManager).\n\nThe system maintains the shared data blobs and controls which apps can access\nthem. When your app contributes data blobs, you can indicate which other apps\nshould have access by calling one of the following methods:\n\n- To grant access to a specific set of apps on a device, pass the package names of these apps into [`allowPackageAccess()`](/reference/android/app/blob/BlobStoreManager.Session#allowPackageAccess(java.lang.String,%20byte%5B%5D)).\n- To allow only apps whose certificates are signed using the same key as the one used for your app---such as an app suite that you manage---call [`allowSameSignatureAccess()`](/reference/android/app/blob/BlobStoreManager.Session#allowSameSignatureAccess()).\n- To grant access to all apps on a device, call [`allowPublicAccess()`](/reference/android/app/blob/BlobStoreManager.Session#allowPublicAccess()).\n\nAccess shared data blobs\n\nThe system represents each shared data blob using a\n[`BlobHandle`](/reference/android/app/blob/BlobHandle) object. Each instance of `BlobHandle`\ncontains a cryptographically-secure hash and some identifying details for the\ndataset.\n\nTo access shared data blobs, download identifying details from the server. Using\nthese details, check whether the dataset is already available on the system.\n\nThe next step depends on whether data is available.\n\nDataset available\n\nIf the dataset is already available on the device, then access it from the system,\nas shown in the following code snippet: \n\nKotlin \n\n```kotlin\nval blobStoreManager =\n getSystemService(Context.BLOB_STORE_SERVICE) as BlobStoreManager\n// The label \"Sample photos\" is visible to the user.\nval blobHandle = BlobHandle.createWithSha256(sha256DigestBytes,\n \"Sample photos\",\n System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1),\n \"photoTrainingDataset\")\ntry {\n val input = ParcelFileDescriptor.AutoCloseInputStream(\n blobStoreManager.openBlob(blobHandle))\n useDataset(input)\n}\n```\n\nJava \n\n```java\nBlobStoreManager blobStoreManager =\n ((BlobStoreManager) getSystemService(Context.BLOB_STORE_SERVICE));\nif (blobStoreManager != null) {\n // The label \"Sample photos\" is visible to the user.\n BlobHandle blobHandle = BlobHandle.createWithSha256(\n sha256DigestBytes,\n \"Sample photos\",\n System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1),\n \"photoTrainingDataset\");\n try (InputStream input = new ParcelFileDescriptor.AutoCloseInputStream(\n blobStoreManager.openBlob(blobHandle))) {\n useDataset(input);\n }\n}\n```\n\nDataset unavailable\n\nIf the dataset isn't available, then download it from the server and contribute it\nto the system, as shown in the following code snippet: \n\nKotlin \n\n```kotlin\nval sessionId = blobStoreManager.createSession(blobHandle)\ntry {\n val session = blobStoreManager.openSession(sessionId)\n try {\n // For this example, write 200 MiB at the beginning of the file.\n val output = ParcelFileDescriptor.AutoCloseOutputStream(\n session.openWrite(0, 1024 * 1024 * 200))\n writeDataset(output)\n\n session.apply {\n allowSameSignatureAccess()\n allowPackageAccess(your-app-package,\n app-certificate)\n allowPackageAccess(some-other-app-package,\n app-certificate)\n commit(mainExecutor, callback)\n }\n }\n}\n```\n\nJava \n\n```java\nlong sessionId = blobStoreManager.createSession(blobHandle);\ntry (BlobStoreManager.Session session =\n blobStoreManager.openSession(sessionId)) {\n // For this example, write 200 MiB at the beginning of the file.\n try (OutputStream output = new ParcelFileDescriptor.AutoCloseOutputStream(\n session.openWrite(0, 1024 * 1024 * 200)))\n writeDataset(output);\n session.allowSameSignatureAccess();\n session.allowPackageAccess(your-app-package,\n app-certificate);\n session.allowPackageAccess(some-other-app-package,\n app-certificate);\n session.commit(getMainExecutor(), callback);\n }\n}\n```"]]