Почему на некоторых устройствах не доступен новый FaceDetector Play-Services?

Задний план

Google выпустил несколько месяцев назад новый API для обнаружения лиц на растровых изображениях:

  • http://android-developers.blogspot.co.il/2015/08/face-detection-in-google-play-services.html
  • https://developers.google.com/vision/introduction#apis
  • https://developers.google.com/vision/face-detection-concepts#face_orientation
  • https://search-codelabs.appspot.com/codelabs/face-detection#1
  • https://github.com/googlesamples/android-vision

Он должен быть быстрее и лучше, чем встроенный класс FaceDetector , и он не имеет ограничений / ограничений по сравнению с ним (например, необходимость в том, что входная растровая карта будет иметь конфигурацию 565, ширину растрового изображения, которая является четной, и иметь максимальные грани для обнаружения).

Код довольно прост:

проявляются:

<meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="face" /> 

Ява:

 FaceDetector faceDetector = new FaceDetector.Builder(getApplicationContext()).setTrackingEnabled(false) .build(); if(!faceDetector.isOperational()){ //show error return; } Frame frame = new Frame.Builder().setBitmap(myBitmap).build(); SparseArray<Face> faces = faceDetector.detect(frame); 

Проблема

Похоже, что API недоступен на некоторых устройствах, возвращая «false» при вызове «isOperational ()».

  • На Nexus 4 (Android 4.4.4) и Nexus 5 (Android 6.0.1) он вообще не работает
  • На Nexus 5x (Android 6.0.1) и Galaxy S4 (Android 5.0) он отлично работает
  • На LG G2 (Android 4.2.2) он работал только со второго запуска образца.

Что я нашел

Я нашел некоторые подсказки:

  1. В Github ( здесь ) другие люди также нашли эту проблему.

  2. Образец говорит (в «фото-демо», внутри файла «PhotoViewerActivity.java») библиотека может быть недоступна, но если это не так, она будет загружена:

     if (!safeDetector.isOperational()) { // Note: The first time that an app using face API is installed on a device, GMS will // download a native library to the device in order to do detection. Usually this // completes before the app is run for the first time. But if that download has not yet // completed, then the above call will not detect any faces. // // isOperational() can be used to check if the required native library is currently // available. The detector will automatically become operational once the library // download completes on device. Log.w(TAG, "Face detector dependencies are not yet available."); // Check for low storage. If there is low storage, the native library will not be // downloaded, so detection will not become operational. IntentFilter lowstorageFilter = new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW); boolean hasLowStorage = registerReceiver(null, lowstorageFilter) != null; if (hasLowStorage) { Toast.makeText(this, R.string.low_storage_error, Toast.LENGTH_LONG).show(); Log.w(TAG, getString(R.string.low_storage_error)); } } 

Я попытался сбросить приложение игровых сервисов (так что, возможно, библиотека будет вынуждена повторно загрузиться), но, похоже, она не работала (попробовал Nexus 5).

Вопрос

  1. Есть ли способ заставить библиотеку загружаться, а затем начать использовать API? Есть ли слушатель этой операции?

  2. Будет ли использовать «isOperational» для запуска этой загрузки?

  3. Почему он не доступен на некоторых устройствах Nexus? Я пропустил здесь что-то, что я должен был знать об использовании этой библиотеки?

  4. Это действительно без ограничений / ограничений на ввод, как я нашел? Я заметил, что кто-то сообщил о проблемах памяти ( здесь ). Будет ли использование try-catch (OutOfMemoryError) справляться с управлением OOM?

О том, почему он не работает на некоторых устройствах, Google ответил на это :

Известная проблема с новой версией GMSCore (v9), которая была выпущена только сегодня. Из примечаний к выпуску:

  • Услуга, требуемая Mobile Vision, теперь отключена из-за серьезной ошибки в этом сервисе. Это предотвратит использование пользователями тех пользователей, которые еще не использовали обнаружение лица или штрих-кода. Мы не рекомендуем добавлять новые функции Mobile Vision в ваше приложение, пока эта проблема не будет исправлена.
  • Для приложений, которые уже используют функции Mobile Vision, проверьте FaceDetector.isOperational () или BarcodeDetector.isOperational (), чтобы подтвердить готовность детектора, прежде чем использовать детектор лица или штрих-кода.

Я также столкнулся с той же проблемой. Обходной путь, который я сделал, это:

  • Удаленные обновления сервисов Google Play
  • Установленная версия Google Play Services версии 8.7.xx с сайта apkmirror
  • Очищенные данные и кеш и перезапуск устройства (не уверен, что это необходимо)
  • Когда я запустил приложение, он попросил меня обновить сервисы Google Play
  • Я ударил обновления и ударил …..

Сейчас он работает так, как ожидалось.

PS: В Google Play Services доступны несколько вариантов. Убедитесь, что вы правильно выбрали.

Intereting Posts