الوصول إلى مجموعات البيانات المشتركة
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
بدءًا من الإصدار 11 من نظام التشغيل Android (المستوى 30 من واجهة برمجة التطبيقات)، يخزّن النظام مؤقتًا مجموعات البيانات الكبيرة التي يمكن أن تصل إليها تطبيقات متعددة لحالات استخدام مثل تعلُّم الآلة وتشغيل الوسائط. تساعد هذه الوظيفة في تقليل تكرار البيانات، سواء عبر الشبكة أو على القرص.
عندما يحتاج تطبيقك إلى الوصول إلى مجموعة بيانات كبيرة مشترَكة، يمكنه أولاً البحث عن مجموعات البيانات المخزّنة مؤقتًا هذه، والتي تُسمى كائنات ثنائية كبيرة مشترَكة، قبل تحديد ما إذا كان سيتم تنزيل نسخة جديدة. يمكن للتطبيقات الوصول إلى وظيفة مجموعات البيانات المشتركة هذه باستخدام واجهات برمجة التطبيقات في BlobStoreManager
.
يحتفظ النظام بمجموعات البيانات المشترَكة ويتحكّم في التطبيقات التي يمكنها الوصول إليها. عندما يساهم تطبيقك في إنشاء كتل بيانات، يمكنك تحديد التطبيقات الأخرى التي يجب أن يكون لديها إذن الوصول إليها من خلال استدعاء إحدى الطرق التالية:
- لمنح إذن الوصول إلى مجموعة معيّنة من التطبيقات على جهاز، مرِّر أسماء حِزم هذه التطبيقات إلى
allowPackageAccess()
.
- للسماح فقط للتطبيقات التي تم توقيع شهاداتها باستخدام المفتاح نفسه المستخدَم لتطبيقك، مثل مجموعة تطبيقات تديرها، استخدِم الدالة
allowSameSignatureAccess()
.
- لمنح إذن الوصول إلى جميع التطبيقات على جهاز، استخدِم الدالة
allowPublicAccess()
.
الوصول إلى كائنات البيانات المشتركة
يمثّل النظام كل كائن ثنائي كبير مشترك باستخدام كائن
BlobHandle
. يحتوي كل مثيل من BlobHandle
على تجزئة آمنة تشفيرًا وبعض التفاصيل التعريفية لمجموعة البيانات.
للوصول إلى وحدات البيانات الثنائية الكبيرة المشترَكة، نزِّل تفاصيل التعريف من الخادم. باستخدام هذه التفاصيل، تحقَّق مما إذا كانت مجموعة البيانات متوفرة على النظام.
تعتمد الخطوة التالية على ما إذا كانت البيانات متاحة.
مجموعة البيانات متاحة
إذا كانت مجموعة البيانات متاحة على الجهاز، يمكنك الوصول إليها من النظام،
كما هو موضّح في مقتطف الرمز البرمجي التالي:
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```"]]