方法后,释放异常相机preVIEW称为 [英] Method called after release Exception Camera preview

查看:210
本文介绍了方法后,释放异常相机preVIEW称为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是用我的相机preVIEW类中的一个活动类(CameraActivity)。在OnResume相机和preVIEW发起。在将OnPause,我放相机的资源。当应用程序被启动,一切工作正常里面的OnResume但是当我开始通过意向另一个活动(如打开URL的浏览器),然后回到我的活动则异常发生内部OnResume始发CAMER preVIEW类。请从下面的code:

// CameraActivity类

 公共无效onResume(){
    super.onResume();
    Log.d(里onResume,相机===+ mCamera,里面onResume);
    尝试 {
        如果(mCamera == NULL)
        {

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


        autoFocusHandler =新的处理程序();
        mCamera = getCameraInstance();
        INT旋转= this.getWindowManager()getDefaultDisplay()getRotation()。


        扫描=新的图象扫描();
        scanner.setConfig(0,Config.X_DENSITY,3);
        scanner.setConfig(0,Config.Y_DENSITY,3);

        米preVIEW =新相机preVIEW(这一点,mCamera,previewCb,autoFocusCB);

        的FrameLayout preVIEW =(的FrameLayout)findViewById(R.id.camera preVIEW);
        preview.addView(M preVIEW);



    }





}赶上(例外五){
    // TODO自动生成的catch块
    Log.e(onResume,Log.getStackTraceString(e)条);
}



公共无效的onPause {
    尝试 {
        super.onPause();
        如果(mCamera!= NULL){
            previewing = FALSE;
            mCamera.stop preVIEW();
                mCamera.set previewCallback(空);
                mCamera.release();
                mCamera = NULL;
                米preVIEW = NULL;


    }
}赶上(例外五){
    // TODO自动生成的catch块
    Log.e(releaseCamera,Log.getStackTraceString(e)条);
}
}



 公共静态相机getCameraInstance(){
        相机C = NULL;
        尝试 {
            C = Camera.open();
        }赶上(例外五){
            Log.e(getCameraInstance,Log.getStackTraceString(e)条);

    }
    返回℃;
}
 

//下面是摄像头preVIEW类:

 公共类相机preVIEW延伸SurfaceView实现SurfaceHolder.Callback {
    私人SurfaceHolder mHolder;
    相机mCamera;
    previewCallback previewCallback;
    AutoFocusCallback autoFocusCallback;
    私人诠释旋转;
    公众诠释getRotation(){
        返回旋转;
    }

    公共无效setRotation(INT旋转){
        this.rotation =旋转;
    }

    公共摄像头preVIEW(上下文的背景下,摄像头的摄像头,
                         previewCallback previewCb,
                         AutoFocusCallback autoFocusCb){
        超(上下文);
        mCamera =摄像头;
        previewCallback = previewCb;
        autoFocusCallback = autoFocusCb;

        / *
         *设置相机如果支持连续对焦,否则使用
         *软件自动对焦。仅适用于API级别> = 9。
         * /
        / *
        Camera.Parameters参数= camera.getParameters();
        对于(字符串型F:parameters.getSupportedFocusModes()){
            如果(F == Parameters.FOCUS_MODE_CONTINUOUS_PICTURE){
                mCamera.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
                autoFocusCallback = NULL;
                打破;
            }
        }
        * /

        //安装SurfaceHolder.Callback所以我们得到通知时,该
        //下垫面创建和销毁。
        mHolder = getHolder();
        mHolder.addCallback(本);

        //德precated设置,但在Android上之前的版本3.0所需
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }


    公共无效surfaceCreated(SurfaceHolder持有者){
        //表面有被创建,现在告诉相机在哪里画preVIEW。
        尝试 {
            如果(mCamera == NULL){
                mCamera = Camera.open();
            }
            mCamera.set previewDisplay(保持器);
        }赶上(IOException异常E){
            Log.d(DBG,错误设置摄像头preVIEW:+ e.getMessage());
        }
    }

    公共无效surfaceDestroyed(SurfaceHolder持有者){

        //摄像机$发布活动p $ PVIEW
    }

    公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,高度INT){
        / *
         *如果你的preVIEW可以改变或旋转,在这里采取这些事件的照顾。
         *请务必调整或重新格式化之前停止preVIEW。
         * /
        如果(mHolder.getSurface()== NULL){
          // preVIEW表面不存在
          返回;
        }

        在进行更改之前//停止preVIEW
        尝试 {
            mCamera.stop preVIEW();
        }赶上(例外五){
          //忽略:试图阻止一个不存在的preVIEW
        }

尝试{
            mCamera.set previewDisplay(mHolder);
            mCamera.set previewCallback(previewCallback);
            mCamera.start preVIEW();
            mCamera.autoFocus(autoFocusCallback);
        }赶上(例外五){
            Log.d(DBG,错误启动摄像头preVIEW:+ e.getMessage());
        }
    }

}
 

这是从logcat的:

 一十月11号至五日:14:34.585:E / AndroidRuntime(7864):致命异常:主要
十月11号至5日:14:34.585:E / AndroidRuntime(7864):java.lang.RuntimeException的:方法释放后称为()
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.hardware.Camera.set previewDisplay(本机方法)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.hardware.Camera.set previewDisplay(Camera.java:393)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在com.intagleo.qraugmented.detection.camera.Camera preview.surfaceCreated(相机preview.java:74)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.view.SurfaceView.updateWindow(SurfaceView.java:552)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:215)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.view.View.dispatchWindowVisibilityChanged(View.java:4027)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.view.ViewRoot.performTraversals(ViewRoot.java:790)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.os.Handler.dispatchMessage(Handler.java:99)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.os.Looper.loop(Looper.java:130)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在android.app.ActivityThread.main(ActivityThread.java:3687)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在java.lang.reflect.Method.invokeNative(本机方法)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在java.lang.reflect.Method.invoke(Method.java:507)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:867)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
十月11号至5日:14:34.585:E / AndroidRuntime(7864):在dalvik.system.NativeStart.main(本机方法)
 

修改

我更新surfaceDestroyed,并把记录的建议,但现在我在的onPause得到的异常 - > onSurfaceDestroyed。最初的onPause是执行罚款。

1相机实例在onResume活动类的过法getCameraInstance创造并传递mCamera实例摄像机preVIEW类。我试图让相机实例被创建仅越位onSurfaceCreated并分配回mCamera实例活动类有所改变,但没有奏效。我还注意到,通过调试的$相机preVIEW级是有效的第一次,但第二次相机preVIEW类是空的previewCallBack成员的对$ pviewCallBack成员。

需要注意的是第一次当onResume之称,一切工作正常,但是当它运行后的onPause则异常最初发生虽然code第二次是在onResume一样的。

  1月11号至六日:25:28.375:I / onResume(4332):引发
// Workinf细到现在。现在打开另一个意图活动
一月11号至6日:26:23.500:我/的onPause(4332):引发
一月11号至6日:26:23.804:OnSurfaceDestroyed:启动
一月11号至6日:26:23.945:E / AndroidRuntime(4332):致命异常:主要
一月11号至6日:26:23.945:E / AndroidRuntime(4332):java.lang.RuntimeException的:方法释放后称为()
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.hardware.Camera.stop preVIEW(本机方法)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在com.intagleo.qraugmented.detection.camera.Camera preview.surfaceDestroyed(相机preview.java:85)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:596)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.view.SurfaceView.updateWindow(SurfaceView.java:490)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:215)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.view.View.dispatchWindowVisibilityChanged(View.java:4027)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.view.ViewRoot.performTraversals(ViewRoot.java:790)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.os.Handler.dispatchMessage(Handler.java:99)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.os.Looper.loop(Looper.java:130)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在android.app.ActivityThread.main(ActivityThread.java:3687)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在java.lang.reflect.Method.invokeNative(本机方法)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在java.lang.reflect.Method.invoke(Method.java:507)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:867)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
一月11号至6日:26:23.945:E / AndroidRuntime(4332):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

正如你所添加的摄像头到的FrameLayout,像这样的:

 的FrameLayout preVIEW =(的FrameLayout)findViewById(R.id.camera preVIEW);
preview.addView(M preVIEW);
 

surfaceCreated 方法将被调用,因此 mCamera.set previewDisplay(持有人); 将调用。

在创建/打开一个新的摄像头,的FrameLayout 还有你的previous相机等的 surfaceCreated 将被称为除了新相机。

你应该做的,就是从的FrameLayout 删除您previous摄像头,当你释放你的相机(上的onPause()法)是这样的:

  preview.removeView(M preVIEW);
 

希望它帮助。

I have one activity class(CameraActivity) which is using my CameraPreview class. In "OnResume" the camera and preview are initiated. In "OnPause", i am releasing camera resources. When application is started, everything works fine inside the "OnResume" but when i start another activity through intent (E.g. open url in browser) and then come back to my activity then exception is occured inside "OnResume" originating CamerPreview class. Please find below the code:

//CameraActivity class

public void onResume(){
    super.onResume();
    Log.d("inside onResume, camera==="+mCamera, "inside onResume");
    try {
        if(mCamera==null)
        {

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


        autoFocusHandler = new Handler();
        mCamera = getCameraInstance();
        int rotation = this.getWindowManager().getDefaultDisplay().getRotation();


        scanner = new ImageScanner();
        scanner.setConfig(0, Config.X_DENSITY, 3);
        scanner.setConfig(0, Config.Y_DENSITY, 3);

        mPreview = new CameraPreview(this, mCamera, previewCb, autoFocusCB);

        FrameLayout preview = (FrameLayout)findViewById(R.id.cameraPreview);
        preview.addView(mPreview);



    }





} catch (Exception e) {
    // TODO Auto-generated catch block
    Log.e("onResume",Log.getStackTraceString(e));
}



public void onPause{
    try {
        super.onPause();
        if (mCamera != null) {
            previewing = false;
            mCamera.stopPreview();
                mCamera.setPreviewCallback(null);
                mCamera.release();
                mCamera = null;
                mPreview=null;


    }
} catch (Exception e) {
    // TODO Auto-generated catch block
    Log.e("releaseCamera",Log.getStackTraceString(e));
}
}



 public static Camera getCameraInstance(){
        Camera c = null;
        try {
            c = Camera.open();
        } catch (Exception e){
            Log.e("getCameraInstance",Log.getStackTraceString(e));

    }
    return c;
}

// Following is CameraPreview Class:

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    Camera mCamera;
    PreviewCallback previewCallback;
    AutoFocusCallback autoFocusCallback;
    private int rotation;
    public int getRotation() {
        return rotation;
    }

    public void setRotation(int rotation) {
        this.rotation = rotation;
    }

    public CameraPreview(Context context, Camera camera,
                         PreviewCallback previewCb,
                         AutoFocusCallback autoFocusCb) {
        super(context);
        mCamera = camera;
        previewCallback = previewCb;
        autoFocusCallback = autoFocusCb;

        /*
         * Set camera to continuous focus if supported, otherwise use
         * software auto-focus. Only works for API level >=9.
         */
        /*
        Camera.Parameters parameters = camera.getParameters();
        for (String f : parameters.getSupportedFocusModes()) {
            if (f == Parameters.FOCUS_MODE_CONTINUOUS_PICTURE) {
                mCamera.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
                autoFocusCallback = null;
                break;
            }
        }
        */

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);

        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }


    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, now tell the camera where to draw the preview.
        try {
            if(mCamera==null){
                mCamera=Camera.open();
            }
            mCamera.setPreviewDisplay(holder);
        } catch (IOException e) {
            Log.d("DBG", "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {

        // Camera preview released in activity
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        /*
         * If your preview can change or rotate, take care of those events here.
         * Make sure to stop the preview before resizing or reformatting it.
         */
        if (mHolder.getSurface() == null){
          // preview surface does not exist
          return;
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview();
        } catch (Exception e){
          // ignore: tried to stop a non-existent preview
        }

try{
            mCamera.setPreviewDisplay(mHolder);
            mCamera.setPreviewCallback(previewCallback);
            mCamera.startPreview();
            mCamera.autoFocus(autoFocusCallback);
        } catch (Exception e){
            Log.d("DBG", "Error starting camera preview: " + e.getMessage());
        }
    }

}

This is from logCat:

11-05 10:14:34.585: E/AndroidRuntime(7864): FATAL EXCEPTION: main
11-05 10:14:34.585: E/AndroidRuntime(7864): java.lang.RuntimeException: Method called after release()
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.hardware.Camera.setPreviewDisplay(Native Method)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.hardware.Camera.setPreviewDisplay(Camera.java:393)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at com.intagleo.qraugmented.detection.camera.CameraPreview.surfaceCreated(CameraPreview.java:74)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.view.SurfaceView.updateWindow(SurfaceView.java:552)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:215)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.view.View.dispatchWindowVisibilityChanged(View.java:4027)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.view.ViewRoot.performTraversals(ViewRoot.java:790)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.os.Looper.loop(Looper.java:130)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at android.app.ActivityThread.main(ActivityThread.java:3687)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at java.lang.reflect.Method.invokeNative(Native Method)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at java.lang.reflect.Method.invoke(Method.java:507)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
11-05 10:14:34.585: E/AndroidRuntime(7864):     at dalvik.system.NativeStart.main(Native Method)

EDIT

I updated "surfaceDestroyed" and put logs as suggested but now i am getting exception in "onPause" --> onSurfaceDestroyed. Initially onPause was executing fine.

1- The camera instance is created in "onResume" of activity class through method "getCameraInstance" and passes mCamera instance to CameraPreview Class. I tried to change it so that camera instance is created only onside "onSurfaceCreated" and assigned back the mCamera instance to the activity class but it did not work. I also noticed through debug that previewCallBack member of "CameraPreview" class is valid the first time but second time the "previewCallBack" member of "CameraPreview" class is null.

Note that first time when "onResume" is called, everything works fine but when it runs second time after onPause then exception is occured originally although code is the same in onResume.

11-06 01:25:28.375: I/onResume(4332): INITIATED
// Workinf fine till now. Now opening another intent activity
11-06 01:26:23.500: I/onPause(4332): INITIATED
11-06 01:26:23.804: "OnSurfaceDestroyed": "Initiated"
11-06 01:26:23.945: E/AndroidRuntime(4332): FATAL EXCEPTION: main
11-06 01:26:23.945: E/AndroidRuntime(4332): java.lang.RuntimeException: Method called after release()
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.hardware.Camera.stopPreview(Native Method)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at com.intagleo.qraugmented.detection.camera.CameraPreview.surfaceDestroyed(CameraPreview.java:85)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:596)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.view.SurfaceView.updateWindow(SurfaceView.java:490)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:215)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.view.View.dispatchWindowVisibilityChanged(View.java:4027)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.view.ViewRoot.performTraversals(ViewRoot.java:790)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.os.Looper.loop(Looper.java:130)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at android.app.ActivityThread.main(ActivityThread.java:3687)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at java.lang.reflect.Method.invokeNative(Native Method)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at java.lang.reflect.Method.invoke(Method.java:507)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
11-06 01:26:23.945: E/AndroidRuntime(4332):     at dalvik.system.NativeStart.main(Native Method)

解决方案

As you have added the camera to the FrameLayout, like this:

FrameLayout preview = (FrameLayout)findViewById(R.id.cameraPreview);
preview.addView(mPreview);

The surfaceCreated method will be called and so mCamera.setPreviewDisplay(holder); will be called.

When you create/open a new camera, the FrameLayout still has your previous camera and so its surfaceCreated will be called in addition to your new camera.

What you should do, is remove your previous camera from FrameLayout when you release your camera (on onPause() method) like this:

preview.removeView(mPreview);

Hope it helps.

这篇关于方法后,释放异常相机preVIEW称为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆