2014-07-04 119 views
0

我有一项服务,可以打开前置摄像头并显示预览。 现在我想对预览图像进行一些图像处理,因此我设置了预览回调。摄像头在服务和预览帧

我的问题是没有调用回调,我得到臭名昭着的编舞消息“跳过X帧...太多的工作在其主线程” 这似乎很奇怪,因为我目前所做的回调打印日志行。此外,当我调试(通过ADT),并打破了日志打印行,它被称为(但不是如果我让它运行,然后尝试在线路上打破它)。 这种情况发生在我的平板电脑上运行时(我没有使用emultor),但是当我在手机上运行它时(Nexus 5比我的平板电脑更强大),每次都会成功调用回调,不会跳过任何帧。

我定制surfaceholder surfaceCreated():

public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     mCamera.setPreviewDisplay(holder); 

    } catch (IOException e) { 
     Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
    } 
    try { 
     mCamera.setPreviewCallback(new Camera.PreviewCallback() { 

      public void onPreviewFrame(byte[] data, Camera arg1) { 
        Log.d("Freshub.BackgroundService", "onPreviewFrame Called!!"); 
      } 
     }); 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
    mCamera.startPreview(); 
} 

任何建议至于怎样得到它在我的平板电脑工作?

回答

0

您不能在Service中执行此操作。
official documentation状态:

A服务是可以在后台执行长时间运行的操作和不提供用户界面的应用组件。

你应该在活动中完成它。

+1

感谢您的回答,但那是非常错误的。一项服务不提供用户界面,但它确实可以容纳一个视图,因为我在布局上显示了一个相机预览,并且我的手机上的一切正常。 – Ysch

+0

如果未显示视图,则系统不会让您从相机捕捉帧。顺便说一句,在活动环境之外持有视图肯定会导致内存泄漏;) –

+1

显示视图,在我的手机上一切正常。从活动上下文中持有视图本身不会导致内存泄漏。它其实是一个很常见的做法。以Facebook Messenger为例(如下所示:[http://www.piwai.info/chatheads-basics/] – Ysch