【问题标题】:Using front camera on Nexus 7 with Android 4.2.2 doesn't work?在装有 Android 4.2.2 的 Nexus 7 上使用前置摄像头不起作用?
【发布时间】:2013-04-03 20:21:17
【问题描述】:

我有一个 Android 应用程序,我可以在其中使用前置摄像头拍摄照片。我使用了这里描述的方法:http://android-er.blogspot.sk/2010/12/add-overlay-on-camera-preview.html。 它适用于搭载 Android 2.3.6 的 Nexus S,适用于搭载 Android 4.1.1 的 HTC One X

它不适用于装有最新 Android 4.2.2 的 Asus Nexus 7,当我尝试拍照时,我在日志中看到了这个:

04-03 22:06:56.181: I/MainSSCActivity(24745): camera take picture START
04-03 22:06:56.191: E/NvOmxCamera(24952): OMX_ERRORTYPE android::NvOmxCamera::getCameraStereoMode(NvxComponent*, NvOmxCameraUserStereoMode&): Error: invalid NVX mode 0.
04-03 22:06:56.191: E/NvOmxCamera(24952): OMX_ERRORTYPE android::NvOmxCamera::getCameraStereoModeAndCaptureInfo(NvxComponent*, NvOmxCameraUserStereoMode&, NVX_STEREOCAPTUREINFO&): getCameraStereoMode failed with 0x00000000
04-03 22:06:56.191: D/NvOsDebugPrintf(24952): NvMMLiteJPEGEncSetAttribute: Incorrect value 0 for stereo capture type
04-03 22:06:56.191: E/NvOmxCameraSettings(24952): OMX_ERRORTYPE android::programStereoInfo(OMX_HANDLETYPE, const NVX_STEREOCAPTUREINFO&, android::NvxWrappers*): pNvxWrappers->OMX_SetConfigIL failed with 0x80001005
04-03 22:06:56.351: I/MainSSCActivity(24745): camera take picture END
04-03 22:06:56.391: I/MainSSCActivity(24745): ***** surface destroyed
04-03 22:06:56.401: I/hwcomposer(130): Setting interactive mode: On
04-03 22:06:56.481: E/BufferQueue(130): [SurfaceView] queueBuffer: SurfaceTexture has been abandoned!
04-03 22:06:56.491: E/SurfaceTextureClient(24952): queueBuffer: error queuing buffer to SurfaceTexture, -19
04-03 22:06:56.491: E/NvOmxCamera(24952): Queue Buffer Failed
04-03 22:06:56.491: A/libc(24952): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 25019 (Binder_3)
04-03 22:06:56.491: D/MainSSCActivity(24745): RAW bytes: null
04-03 22:06:56.491: D/MainSSCActivity(24745): shutter
04-03 22:06:56.591: I/DEBUG(128): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
04-03 22:06:56.591: I/DEBUG(128): Build fingerprint: 'google/nakasig/tilapia:4.2.2/JDQ39/573038:user/release-keys'
04-03 22:06:56.591: I/DEBUG(128): Revision: '0'
04-03 22:06:56.591: I/DEBUG(128): pid: 24952, tid: 25019, name: Binder_3  >>> /system/bin/mediaserver <<<
04-03 22:06:56.591: I/DEBUG(128): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
04-03 22:06:56.701: I/DEBUG(128):     r0 00000027  r1 deadbaad  r2 4022f258  r3 00000000
04-03 22:06:56.701: I/DEBUG(128):     r4 00000000  r5 42de4d6c  r6 415dc640  r7 411b7c58
04-03 22:06:56.701: I/DEBUG(128):     r8 411cfe30  r9 415dc8c8  sl 00000000  fp 00000001
04-03 22:06:56.701: I/DEBUG(128):     ip 40be2de4  sp 42de4d68  lr 402022f9  pc 401fe992  cpsr 60000030
04-03 22:06:56.701: I/DEBUG(128):     d0  0000000000000000  d1  000000007fc00000
04-03 22:06:56.701: I/DEBUG(128):     d2  3fb15bd900000000  d3  3f114ee7df28fa15
04-03 22:06:56.701: I/DEBUG(128):     d4  0000000000000000  d5  3ff0000000000000
04-03 22:06:56.701: I/DEBUG(128):     d6  0000000541000000  d7  7fc0000000000000
04-03 22:06:56.701: I/DEBUG(128):     d8  0000000000000000  d9  0000000000000000
04-03 22:06:56.701: I/DEBUG(128):     d10 0000000000000000  d11 0000000000000000

到目前为止,我真的不知道出了什么问题以及如何解决它。 有谁能够帮我?提前致谢。

【问题讨论】:

  • 这是一个段错误。本机库尝试写入由 Java 传递给它的内存,然后在使用前释放,反之亦然。崩溃似乎是在 libc 中,这使得它很难调试。我会检查您明确调用本机库的任何地方,或者您将引用传递给可能使用某个库的任何地方(例如 Camera api)。

标签: android camera android-camera image nexus-7


【解决方案1】:

好的,感谢大家向我指出了这样一个事实,即表面会尽快被破坏。我有一个特定的情况,有更多的视图相互显示,并且通过在错误的地方调用 surfaceView.setVisibility((View.INVISIBLE) ,实际上是我在破坏它。我把它放在最后,所以,它的工作方式我正在关注:

myPictureCallback_JPG = new PictureCallback() {

@Override
public void onPictureTaken(byte[] bytes, Camera arg1) {
    Log.d(TAG, "bytes.length: " + bytes.length);
    String image = Base64.encodeToString(bytes, Base64.NO_WRAP);
    Log.i(TAG, "base64 image: " + image);
    String url = "javascript:takePicture('" + image + "');";

    wv.loadUrl(url);

    camera.stopPreview();
    camera.release();
    camera = null;
    surfaceView.setVisibility(View.INVISIBLE);
    wv.setVisibility(View.VISIBLE);
    viewControl.setVisibility(View.INVISIBLE);
}
};

【讨论】:

    【解决方案2】:

    尝试这样做,它可能会起作用。覆盖活动中的“onPause”方法并调用“stopPreview()”。看起来表面在您调用 stopPreview() 之前就已被破坏,因此出现错误 “SurfaceTexture 已被放弃!”

    @Override
    public void onPause(Bundle savedInstanceState) {
        super.onPause(savedInstanceState);
        if(camera != null) 
            camera.stopPreview();
    }
    


    当应用程序传递给相机驱动程序的 Surface(缓冲区)在驱动程序仍在访问它们时被破坏时,就会发生这种情况。

    让我知道这是否有效。如果这不起作用,请将整个 logcat 从相机应用程序的开头发布到您关闭应用程序的位置。

    【讨论】:

    • 您好,谢谢,有空就去看看。详细描述情况:我有两个视图的框架布局,webview 和surfaceview。我在 webview 中显示 web 门户,camerapreview 被隐藏(surfaceview)。一旦我按下按钮拍照(按钮在 webportal 上并且我正在使用 Javascript API 进行通信),webview 被隐藏并且 camerapreview 开始。到目前为止,所以好的。我在那里充气按钮,所以要拍摄照片,用户按下按钮,照片被拍摄(它适用于 2.3.6、4.1.1)然后,webview 显示为图片,相机预览再次隐藏。
    • 在 4.2.2 中,我可以显示相机预览,但我拍摄了照片,然后我收到了从 LogCat 粘贴的错误。
    【解决方案3】:

    这解决了我的问题:

    我正在使用 mcamera.setOneShotPreviewCallback(mPreviewCallback);从相机中获取图片。

    我已经通过 mCamera.takePicture(null, null,mPictureCallback); 改变了它

    在 mPictureCallBack 中,我处理 jpeg,在我的情况下,我拍摄另一张照片,在拍摄的照片之间重新开始预览(stopPreview 和 startPreview)。

    顺便说一句,我的预览是基于 Samples Api 17 /android-sdks/samples/android-17/ApiDemos/src/com/example/android/apis/graphics/CameraPreview 中提供的。

    【讨论】:

    • 对不起,我不明白你做了什么才能让它工作。您认为您可以粘贴无效的代码 sn-p 和实际有效的代码吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 2020-07-23
    相关资源
    最近更新 更多