نقل مواد العرض على Wear

لإرسال عناصر ثنائية كبيرة عبر عملية نقل البلوتوث، مثل تسجيل صوتي من جهاز آخر، يمكنك إرفاق Asset بعنصر بيانات ثم وضع العنصر في مخزن البيانات المنسوخ.

تتعامل مواد العرض تلقائيًا مع التخزين المؤقت للبيانات لمنع إعادة نقلها والحفاظ على معدّل نقل بيانات البلوتوث. ومن الأنماط الشائعة التي يتم تطبيقها في التطبيقات المحمولة باليد تنزيل صورة وتقليصها إلى الحجم المناسب لعرضها على الأجهزة القابلة للارتداء ونقلها إلى التطبيق القابل للارتداء كمادة عرض. توضّح الأمثلة التالية هذا النمط.

ملاحظة: على الرغم من أنّ حجم عناصر البيانات يقتصر نظريًا على 100 كيلوبايت، يمكن استخدام عناصر بيانات أكبر من الناحية العملية. بالنسبة إلى عناصر البيانات الأكبر حجمًا، افصل البيانات حسب المسارات الفريدة وتجنَّب استخدام مسار واحد لجميع البيانات. يؤثر نقل مواد العرض الكبيرة في تجربة المستخدم في كثير من الحالات، لذا اختبِر تطبيقاتك للمساعدة في ضمان تحقيق أداء جيد عند نقل مواد العرض الكبيرة.

نقل مادة عرض

أنشِئ مادة العرض باستخدام إحدى طرق create...() في الفئة Asset. حوِّل صورة نقطية إلى بث بايت، ثم استدعِ createFromBytes() لإنشاء مادة العرض، كما هو موضّح في النموذج التالي.

Kotlin

private fun createAssetFromBitmap(bitmap: Bitmap): Asset =
    ByteArrayOutputStream().let { byteStream ->
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream)
        Asset.createFromBytes(byteStream.toByteArray())
    }

Java

private static Asset createAssetFromBitmap(Bitmap bitmap) {
    final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
    return Asset.createFromBytes(byteStream.toByteArray());
}

بعد ذلك، أرفِق مادة العرض بعنصر بيانات باستخدام الطريقة putAsset() في DataMap أو PutDataRequest. بعد ذلك، ضَع عنصر البيانات في مخزن البيانات باستخدام طريقة putDataItem() كما هو موضّح في النماذج التالية.

يستخدم النموذج التالي "PutDataRequest":

Kotlin

val asset: Asset = BitmapFactory.decodeResource(resources, R.drawable.image).let { bitmap ->
    createAssetFromBitmap(bitmap)
}
val request: PutDataRequest = PutDataRequest.create("/image").apply {
    putAsset("profileImage", asset)
}
val putTask: Task<DataItem> = Wearable.getDataClient(context).putDataItem(request)

Java

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Asset asset = createAssetFromBitmap(bitmap);
PutDataRequest request = PutDataRequest.create("/image");
request.putAsset("profileImage", asset);
Task<DataItem> putTask = Wearable.getDataClient(context).putDataItem(request);
يستخدم النموذج التالي `PutDataMapRequest`:

Kotlin

val asset: Asset = BitmapFactory.decodeResource(resources, R.drawable.image).let { bitmap ->
    createAssetFromBitmap(bitmap)
}
val request: PutDataRequest = PutDataMapRequest.create("/image").run {
    dataMap.putAsset("profileImage", asset)
    asPutDataRequest()
}
val putTask: Task<DataItem> = Wearable.getDataClient(context).putDataItem(request)

Java

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Asset asset = createAssetFromBitmap(bitmap);
PutDataMapRequest dataMap = PutDataMapRequest.create("/image");
dataMap.getDataMap().putAsset("profileImage", asset);
PutDataRequest request = dataMap.asPutDataRequest();
Task<DataItem> putTask = Wearable.getDataClient(context).putDataItem(request);

استلام مواد العرض

عند إنشاء مادة عرض، من الأفضل قراءتها واستخراجها من جهة أخرى على الرابط. في ما يلي مثال على كيفية تنفيذ معاودة الاتصال لرصد تغيير في مادة العرض واستخراجها:

Kotlin

override fun onDataChanged(dataEvents: DataEventBuffer) {
    dataEvents
            .filter { it.type == DataEvent.TYPE_CHANGED && it.dataItem.uri.path == "/image" }
            .forEach { event ->
                val bitmap: Bitmap? = DataMapItem.fromDataItem(event.dataItem)
                        .dataMap.getAsset("profileImage")
                        .let { asset -> loadBitmapFromAsset(asset) }
                // Do something with the bitmap
            }
}

fun loadBitmapFromAsset(asset: Asset): Bitmap? {
    // Convert asset into a file descriptor and block until it's ready
    val assetInputStream: InputStream? =
            Tasks.await(Wearable.getDataClient(context).getFdForAsset(asset))
            ?.inputStream

    return assetInputStream?.let { inputStream ->
        // Decode the stream into a bitmap
        BitmapFactory.decodeStream(inputStream)
    } ?: run {
        Log.w(TAG, "Requested an unknown Asset.")
        null
    }
}

Java

@Override
public void onDataChanged(DataEventBuffer dataEvents) {
  for (DataEvent event : dataEvents) {
    if (event.getType() == DataEvent.TYPE_CHANGED &&
        event.getDataItem().getUri().getPath().equals("/image")) {
      DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
      Asset profileAsset = dataMapItem.getDataMap().getAsset("profileImage");
      Bitmap bitmap = loadBitmapFromAsset(profileAsset);
      // Do something with the bitmap
    }
  }
}

public Bitmap loadBitmapFromAsset(Asset asset) {
    if (asset == null) {
        throw new IllegalArgumentException("Asset must be non-null");
    }
    // Convert asset into a file descriptor and block until it's ready
    InputStream assetInputStream =
        Tasks.await(Wearable.getDataClient(context).getFdForAsset(asset))
            .getInputStream();
    if (assetInputStream == null) {
        Log.w(TAG, "Requested an unknown Asset.");
        return null;
    }
    // Decode the stream into a bitmap
    return BitmapFactory.decodeStream(assetInputStream);
}

لمزيد من المعلومات، يُرجى الاطّلاع على نموذج المشروع DataLayer على GitHub.