为什么某些设备上没有新的Play-Services FaceDetector?

时间:2016-05-18 13:18:47

标签: android google-play-services face-detection

背景

谷歌几个月前发布了一个用于检测位图面部的新API:

它应该比built-in FaceDetector class更快更好,并且它没有任何限制/限制(比如输入位图需要配置565,位图宽度为&#) 39; s均匀,并且有最大面孔可以检测到。)

代码也非常简单:

清单:

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

的java:

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在某些设备上不可用,返回&#34; false&#34;在调用&#34; isOperational()&#34;。

  • 在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(here)上,其他人也发现了这个问题。

  2. 示例says(在#34;照片演示&#34;内部&#34; PhotoViewerActivity.java&#34;文件中)该库可能不可用,但如果它& #39;不是,它将被下载:

    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));
        }
    }
    
  3. 我尝试重置播放服务应用程序(因此可能会强制重新下载该库),但它似乎无法正常工作(在Nexus 5上尝试过)。

    问题

    1. 有没有办法强制下载库,然后开始使用API​​?这个操作有听众吗?

    2. 使用&#34; isOperational&#34;触发此下载?

    3. 为什么某些Nexus设备无法使用?我在这里错过了一些关于使用这个库的知识吗?

    4. 我是否真的没有输入的限制/限制,我发现了?我注意到有人报告了内存问题(here)。使用try-catch(OutOfMemoryError)有助于处理OOM吗?

2 个答案:

答案 0 :(得分:0)

关于它为什么不能在某些设备上运行Google answered it

  

新版本的GMSCore(v9)存在一个已知问题   刚刚今天发布。从发行说明:

     
      
  • Mobile Vision要求的服务现在因严重而被禁用   该服务中的错误。这将阻止尚未使用过的用户   使用这些功能检测面部或条形码。我们不   建议在此应用中为您的应用添加新的Mobile Vision功能   问题是固定的。
  •   
  • 对于已使用Mobile Vision功能的应用,   检查FaceDetector.isOperational()或BarcodeDetector.isOperational()   在使用面部或条形码之前确认检测器就绪状态   检测器。
  •   

答案 1 :(得分:0)

我也面临同样的问题。我做的解决方法是:

  • 已卸载Google Play服务的更新
  • 从apkmirror网站安装了8.7.xx版Google Play服务
  • 清除数据并缓存并重新启动设备(不确定是否需要)
  • 当我启动我的应用时,它要求我更新Google Play服务
  • 我点击了更新并敲打.....

它现在按预期工作。

PS:Google Play Services apk有多种版本可供使用。确保选择正确。