0

フロントカメラで写真を撮る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

これまでのところ、何が問題なのか、どうすれば修正できるのか、まったくわかりません。誰でも私を助けることができますか?前もって感謝します。

4

3 に答える 3

2

わかりました、皆さんのおかげで、その表面は本来あるべきよりも早く破壊されるという事実を指摘してくれました。より多くのビューが互いに表示される特定の状況があり、間違った場所で 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);
}
};
于 2013-04-05T11:51:56.297 に答える
0

これは私の場合の問題を解決しました:

私は 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 で提供されているものに基づいています。

于 2013-04-04T16:20:25.413 に答える
0

これをやってみてください、うまくいくかもしれません。アクティビティで「onPause」メソッドをオーバーライドし、「stopPreview()」を呼び出します。stopPreview() を呼び出す前でもサーフェスが破棄されているように見えるため、「SurfaceTexture が破棄されました!」というエラーが表示されます。.

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


これは、アプリがカメラ ドライバーに渡す Surface (バッファー) が、ドライバーがまだそれらにアクセスしている間に破棄された場合に発生します。

それがうまくいくかどうか教えてください。それでも問題が解決しない場合は、カメラ アプリの開始からアプリを閉じるまでの logcat 全体を投稿します。

于 2013-04-04T06:15:23.693 に答える