نقل البيانات لنظام التشغيل Android

تعديل عمليات استيراد Gradle

لا تتطلّب حزمة تطوير البرامج (SDK) الجديدة سوى عنصر واحد لكل واجهة برمجة تطبيقات في ML Kit. لست بحاجة إلى تحديد المكتبات الشائعة، مثل firebase-ml-vision أو firebase-ml-natural-language. يستخدم ML Kit مساحة الاسم com.google.android.gms للمكتبات التي تعتمد على "خدمات Google Play".

Vision APIs

يتم تقديم النماذج المجمّعة كجزء من تطبيقك. يجب تنزيل النماذج الخفيفة. تتوفّر بعض واجهات برمجة التطبيقات في كلّ من الحزمة الرقيقة والحزمة المجمّعة، بينما تتوفّر واجهات أخرى في إحدى الحزمتين فقط:

واجهة برمجة التطبيقاتمُجمَّعةرقيق
التعرّف على النصx (إصدار تجريبي)x
التعرّف على الوجوهxx
المسح الضوئي للرموز الشريطيةxx
تصنيف الصورxx
رصد الأجسام وتتبُّعهاx-

عدِّل العناصر التابعة لمكتبات ML Kit على Android في ملف Gradle للوحدة (على مستوى التطبيق) (عادةً app/build.gradle) وفقًا للجداول التالية:

النماذج المجمّعة

واجهة برمجة التطبيقاتالعناصر القديمةعنصر جديد
المسح الضوئي للرموز الشريطية com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-barcode-model:16.0.1
com.google.mlkit:barcode-scanning:17.3.0
محيط الوجه com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-face-model:19.0.0
com.google.mlkit:face-detection:16.1.7
تصنيف الصور com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-image-label-model:19.0.0
com.google.mlkit:image-labeling:17.0.9
رصد الأجسام com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-object-detection-model:19.0.3
com.google.mlkit:object-detection:17.0.2

نماذج نحيفة

واجهة برمجة التطبيقاتالعناصر القديمةعنصر جديد
المسح الضوئي للرموز الشريطية com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1
التعرّف على الوجوه com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-face-detection:17.1.0
التعرّف على النص com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-text-recognition:19.0.1

‫AutoMLVision Edge

واجهة برمجة التطبيقاتالعنصر القديمعنصر جديد
استخدام AutoML بدون تنزيل com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:17.0.3
‫AutoML مع التنزيل com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:17.0.3
com.google.mlkit:linkfirebase:17.0.0

واجهات برمجة التطبيقات Natural Language API

يتم تقديم النماذج المجمّعة كجزء من تطبيقك. يجب تنزيل النماذج النحيفة:

واجهة برمجة التطبيقاتمُجمَّعةرقيق
معرّف اللغةxx
الرد السريعxx (إصدار تجريبي)

عدِّل العناصر التابعة لمكتبات ML Kit على Android في ملف Gradle للوحدة (على مستوى التطبيق) (عادةً app/build.gradle) وفقًا للجداول التالية:

النماذج المجمّعة

واجهة برمجة التطبيقاتالعناصر القديمةعنصر جديد
معرّف اللغة com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7
com.google.mlkit:language-id:17.0.6
الرد السريع com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7
com.google.mlkit:smart-reply:17.0.4

نماذج نحيفة

واجهة برمجة التطبيقاتالعناصر القديمةعنصر جديد
معرّف اللغة com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7
com.google.android.gms:play-services-mlkit-language-id:17.0.0
الرد السريع com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7
com.google.android.gms:play-services-mlkit-smart-reply:16.0.0-beta1

تعديل أسماء الصفوف

إذا ظهرت صفّك في هذا الجدول، عليك إجراء التغيير الموضّح:

الصف القديمصف جديد
com.google.firebase.ml.common.FirebaseMLException com.google.mlkit.common.MlKitException
com.google.firebase.ml.vision.common.FirebaseVisionImage com.google.mlkit.vision.common.InputImage
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector com.google.mlkit.vision.barcode.BarcodeScanner
com.google.firebase.ml.vision.labeler.FirebaseVisionImageLabel com.google.mlkit.vision.label.ImageLabeler
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector com.google.mlkit.vision.barcode.BarcodeScanner
com.google.firebase.ml.vision.automl.FirebaseAutoMLLocalModel com.google.mlkit.common.model.LocalModel
com.google.firebase.ml.vision.automl.FirebaseAutoMLRemoteModel com.google.mlkit.common.model.CustomRemoteModel
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceImageLabelerOptions com.google.mlkit.vision.label.defaults.ImageLabelerOptions
com.google.firebase.ml.vision.label.FirebaseVisionImageLabel com.google.mlkit.vision.label.ImageLabel
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceAutoMLImageLabelerOptions com.google.mlkit.vision.label.custom.CustomImageLabelerOptions
com.google.firebase.ml.vision.objects.FirebaseVisionObjectDetectorOptions com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

بالنسبة إلى الفئات الأخرى، اتّبِع القواعد التالية:

  • أزِل البادئة FirebaseVision من اسم الصف.
  • أزِل البادئات الأخرى التي تبدأ بالبادئة Firebase من اسم الفئة.

في أسماء الحِزم، استبدِل البادئة com.google.firebase.ml بالبادئة com.google.mlkit.

تعديل أسماء طرق الدفع

تتضمّن هذه العملية تغييرات بسيطة على الرمز:

  • تم تغيير إنشاء مثيل لأداة الكشف/المسح الضوئي/التصنيف/الترجمة… أصبح لكل ميزة الآن نقطة دخول خاصة بها. على سبيل المثال: BarcodeScanning وTextRecognition وImageLabeling وTranslation وما إلى ذلك. يتم استبدال طلبات الخدمة getInstance() في Firebase بطلبات الطريقة getClient() لنقطة دخول الميزة.
  • تمت إزالة عملية إنشاء مثيل تلقائي لفئة TextRecognizer، وذلك بعد أن أضفنا مكتبات إضافية للتعرّف على نصوص أخرى، مثل الصينية والكورية. لاستخدام الخيارات التلقائية مع نموذج التعرّف على النص اللاتيني، يُرجى تعريف التبعية على com.google.android.gms:play-services-mlkit-text-recognition واستخدام TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • تمت إزالة إنشاء مثيل تلقائي لكلّ من ImageLabeler وObjectDetector، وذلك بعد أن أتحنا إمكانية استخدام نماذج مخصّصة لهاتين الميزتين. على سبيل المثال، لاستخدام الخيارات التلقائية مع النموذج الأساسي في ImageLabeling، يُرجى تعريف علاقة تبعية مع com.google.mlkit:image-labeling واستخدام ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) في Java.
  • يمكن إغلاق جميع المعالجات (أداة الرصد/أداة البحث/أداة التصنيف/أداة الترجمة وما إلى ذلك). تأكَّد من استدعاء الطريقة close() عندما لن يتم استخدام هذه العناصر بعد الآن. إذا كنت تستخدمها في Fragment أو AppCompatActivity، إحدى الطرق السهلة لتنفيذ ذلك هي استدعاء LifecycleOwner.getLifecycle() في Fragment أو AppCompatActivity، ثم استدعاء Lifecycle.addObserver.
  • تمت إعادة تسمية processImage() وdetectInImage() في Vision API إلى process() للحفاظ على الاتساق.
  • تستخدم واجهات Natural Language API الآن المصطلح "علامة اللغة" (كما هو محدّد في معيار BCP 47) بدلاً من "رمز اللغة".
  • تمت إزالة طرق Getter في فئات xxxOptions.
  • لم يعُد بالإمكان استخدام طريقة getBitmap() في فئة InputImage(التي تحلّ محلّ FirebaseVisionImage) كجزء من الواجهة العامة. يُرجى الرجوع إلى BitmapUtils.java في نموذج التشغيل السريع في ML Kit للحصول على صورة نقطية تم تحويلها من مدخلات مختلفة.
  • تمت إزالة FirebaseVisionImageMetadata، ويمكنك فقط تمرير البيانات الوصفية للصور، مثل العرض والارتفاع وrotationDegrees والتنسيق، إلى طرق إنشاء InputImages.

في ما يلي بعض الأمثلة على طرق Kotlin القديمة والجديدة:

الإصدار القديم

// Construct image labeler with base model and default options.
val imageLabeler = FirebaseVision.getInstance().onDeviceImageLabeler

// Construct object detector with base model and default options.
val objectDetector = FirebaseVision.getInstance().onDeviceObjectDetector

// Construct face detector with given options
val faceDetector = FirebaseVision.getInstance().getVisionFaceDetector(options)

// Construct image labeler with local AutoML model
val localModel =
    FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build()
val autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build()
    )

جديد

// Construct image labeler with base model and default options.
val imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
// Optional: add life cycle observer
lifecycle.addObserver(imageLabeler)

// Construct object detector with base model and default options.
val objectDetector = ObjectDetection.getClient(ObjectDetectorOptions.DEFAULT_OPTIONS)

// Construct face detector with given options
val faceDetector = FaceDetection.getClient(options)

// Construct image labeler with local AutoML model
val localModel =
  LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build()
val autoMLImageLabeler =
  ImageLabeling.getClient(
    CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build())
  

في ما يلي بعض الأمثلة على طرق Java القديمة والجديدة:

الإصدار القديم

// Construct image labeler with base model and default options.
FirebaseVisionImageLabeler imagelLabeler =
     FirebaseVision.getInstance().getOnDeviceImageLabeler();

// Construct object detector with base model and default options.
FirebaseVisionObjectDetector objectDetector =
     FirebaseVision.getInstance().getOnDeviceObjectDetector();

// Construct face detector with given options
FirebaseVisionFaceDetector faceDetector =
     FirebaseVision.getInstance().getVisionFaceDetector(options);

// Construct image labeler with local AutoML model
FirebaseAutoMLLocalModel localModel =
    new FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build();
FirebaseVisionImageLabeler autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build());

جديد

// Construct image labeler with base model and default options.
ImageLabeler imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS);
// Optional: add life cycle observer
getLifecycle().addObserver(imageLabeler);

// Construct object detector with base model and default options.
ObjectDetector objectDetector = ObjectDetection.getClient(ObjectDetectorOptions.DEFAULT_OPTIONS);

// Construct face detector with given options
FaceDetector faceDetector = FaceDetection.getClient(options);

// Construct image labeler with local AutoML model
LocalModel localModel =
  new LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build();
ImageLabeler autoMLImageLabeler =
  ImageLabeling.getClient(
    new CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build());
  

التغييرات الخاصة بواجهة برمجة التطبيقات

مسح الرموز الشريطية

بالنسبة إلى Barcode Scanning API، تتوفّر الآن طريقتان يمكن من خلالهما تقديم النماذج:

  • من خلال "خدمات Google Play" المعروفة أيضًا باسم "النموذج المصغّر" (يُنصح به): يؤدي ذلك إلى تقليل حجم التطبيق وتتم مشاركة النموذج بين التطبيقات. ومع ذلك، على المطوّرين التأكّد من تنزيل النموذج قبل استخدامه للمرة الأولى.
  • مع حزمة APK الخاصة بتطبيقك، المعروفة أيضًا باسم "الحزمة": يؤدي ذلك إلى زيادة حجم التطبيق، ولكن يعني ذلك أنّ النموذج قابل للاستخدام على الفور.

تختلف عمليتا التنفيذ قليلاً، إذ يتضمّن الإصدار "المجمّع" عددًا من التحسينات مقارنةً بالإصدار "الخفيف". يمكنك الاطّلاع على تفاصيل حول هذه الاختلافات في إرشادات Barcode Scanning API.

التعرّف على الوجوه

بالنسبة إلى Face Detection API، هناك طريقتان يمكن من خلالهما تقديم النماذج:

  • من خلال "خدمات Google Play" المعروفة أيضًا باسم "النموذج المصغّر" (يُنصح به): يؤدي ذلك إلى تقليل حجم التطبيق وتتم مشاركة النموذج بين التطبيقات. ومع ذلك، على المطوّرين التأكّد من تنزيل النموذج قبل استخدامه للمرة الأولى.
  • مع حِزمة APK الخاصة بتطبيقك، أي "مضمّنة": يؤدي ذلك إلى زيادة حجم تنزيل التطبيق، ولكن يعني ذلك أنّ النموذج قابل للاستخدام على الفور.

ويكون سلوك عمليات التنفيذ متطابقًا.

الترجمة

  • تستخدِم TranslateLanguage الآن أسماء قابلة للقراءة للثوابت (مثل ENGLISH) بدلاً من علامات اللغة (EN). كما أنّها أصبحت الآن @StringDef بدلاً من @IntDef، وقيمة الثابت هي علامة اللغة BCP 47 المطابقة.

  • إذا كان تطبيقك يستخدم خيار شرط التنزيل "الجهاز غير نشط"، يُرجى العلم أنّه تمت إزالة هذا الخيار ولا يمكن استخدامه بعد الآن. سيظل بإمكانك استخدام خيار "شحن الجهاز". إذا كنت تريد سلوكًا أكثر تعقيدًا، يمكنك تأخير طلب RemoteModelManager.download باستخدام منطقك الخاص.

AutoML Image Labeling

إذا كان تطبيقك يستخدم خيار شرط التنزيل "الجهاز في وضع الخمول"، يُرجى العلم أنّه تمت إزالة هذا الخيار ولم يعُد بالإمكان استخدامه. سيظل بإمكانك استخدام خيار "شحن الجهاز".

إذا كنت تريد سلوكًا أكثر تعقيدًا، يمكنك تأخير طلب RemoteModelManager.download باستخدام منطقك الخاص.

رصد الأجسام وتتبُّعها

إذا كان تطبيقك يستخدم ميزة رصد العناصر مع التصنيف التقريبي، يُرجى العِلم أنّ حزمة SDK الجديدة غيّرت طريقة عرض فئة التصنيف للعناصر التي تم رصدها.

يتم عرض فئة التصنيف كمثيل من DetectedObject.Label بدلاً من عدد صحيح. يتم تضمين جميع الفئات المحتملة للمصنّف التقريبي في الفئة PredefinedCategory.

في ما يلي مثال على رمز Kotlin القديم والجديد:

الإصدار القديم

if (object.classificationCategory == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

جديد

if (!object.labels.isEmpty() && object.labels[0].text == PredefinedCategory.FOOD) {
    ...
}
// or
if (!object.labels.isEmpty() && object.labels[0].index == PredefinedCategory.FOOD_INDEX) {
    ...
}

في ما يلي مثال على رمز Java القديم والجديد:

الإصدار القديم

if (object.getClassificationCategory() == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

جديد

if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getText().equals(PredefinedCategory.FOOD)) {
    ...
}
// or
if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getIndex() == PredefinedCategory.FOOD_INDEX) {
    ...
}

تمت إزالة الفئة "غير معروف". عندما تكون درجة الثقة في تصنيف أحد العناصر منخفضة، لا نعرض أي تصنيف.

إزالة تبعيات Firebase (اختياري)

لا تنطبق هذه الخطوة إلا عند استيفاء الشروط التالية:

  • أنت تستخدم Firebase ML Kit فقط من بين جميع مكونات Firebase.
  • أن تستخدم واجهات برمجة التطبيقات على الجهاز فقط
  • عدم استخدام خدمة النماذج

في هذه الحالة، يمكنك إزالة تبعيات Firebase بعد نقل البيانات. يُرجى اتّباع الخطوات التالية:

  • أزِل ملف إعداد Firebase عن طريق حذف ملف الإعداد google-services.json في دليل الوحدة (على مستوى التطبيق) لتطبيقك.
  • استبدِل المكوّن الإضافي في خدمات Google لأداة Gradle في ملف Gradle للوحدة (على مستوى التطبيق) (عادةً app/build.gradle) بالمكوّن الإضافي "أداة مطابقة الإصدارات الدقيقة":

قبل

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'  // Google Services plugin

android {
  // …
}

بعد

apply plugin: 'com.android.application'
apply plugin: 'com.google.android.gms.strict-version-matcher-plugin'

android {
  // …
}
  • استبدِل مسار فئة المكوّن الإضافي في خدمات Google لأداة Gradle في ملف Gradle الخاص بمشروعك (على مستوى الجذر) (build.gradle) بمسار فئة المكوّن الإضافي "أداة مطابقة الإصدارات الدقيقة":

قبل

buildscript {
  dependencies {
    // ...

    classpath 'com.google.gms:google-services:4.3.3'  // Google Services plugin
  }
}

بعد

buildscript {
  dependencies {
    // ...

    classpath 'com.google.android.gms:strict-version-matcher-plugin:1.2.1'
  }
}

احذف تطبيقك على Firebase من خلال وحدة تحكّم Firebase باتّباع التعليمات الواردة في الموقع الإلكتروني المخصّص للدعم في Firebase.

الحصول على المساعدة

إذا واجهت أي مشاكل، يُرجى الاطّلاع على صفحة المنتدى التي نوضّح فيها القنوات المتاحة للتواصل معنا.