Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 发布后调用的方法_Android_Android Camera_Release - Fatal编程技术网

Android 发布后调用的方法

Android 发布后调用的方法,android,android-camera,release,Android,Android Camera,Release,这些天来,我试图编写一个定制相机的代码,但是有很多bug我都想不出来。最严重的错误日志如下所示 at android.hardware.Camera.setHasPreviewCallback(Native Method) at android.hardware.Camera.setPreviewCallback(Camera.java:600) java.lang.RuntimeException: Method called after release() at android.

这些天来,我试图编写一个定制相机的代码,但是有很多bug我都想不出来。最严重的错误日志如下所示

at android.hardware.Camera.setHasPreviewCallback(Native Method) 
at android.hardware.Camera.setPreviewCallback(Camera.java:600)  
java.lang.RuntimeException: Method called after release()   
at android.hardware.Camera.setHasPreviewCallback(Native Method) 
at android.hardware.Camera.setPreviewCallback(Camera.java:600)  
at com.baitian.wenta.customcamera.CameraActivity.cameraRelease(SourceFile:210)  
at com.baitian.wenta.customcamera.CameraActivity.runExceptionHandle(SourceFile:526) 
at com.baitian.wenta.customcamera.CameraActivity.updateFlashStatus(SourceFile:859)  
at com.baitian.wenta.customcamera.CameraActivity.onResume(SourceFile:152)   
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1199)  
at com.qihoo360.mobilesafe.loader.b.callActivityOnResume(SourceFile:123)    
at android.app.Activity.performResume(Activity.java:5280)   
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2629)   
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2667)    
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2140)    
at android.app.ActivityThread.access$700(ActivityThread.java:140)   
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 
at android.os.Handler.dispatchMessage(Handler.java:99)  
at android.os.Looper.loop(Looper.java:137)  
at android.app.ActivityThread.main(ActivityThread.java:4921)    
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)   
at dalvik.system.NativeStart.main(Native Method)
似乎在发布后不会调用该方法。每次尝试释放相机时,我都将其设置为null,并且没有多线程调用。 以下是摄像头释放代码:

private void cameraRelease() {
        try {
            if (mCamera != null) {
                mCamera.stopPreview();
                mCamera.release();
                mCameraExceptionLog.addLog("Camera release() After", "");
                mCamera = null;
            }
        } catch (Throwable e) {

        }
    }
这是相机初始化代码

    private void initCamera() {
        try {
            if (mCamera == null) {
                if (Build.VERSION.SDK_INT >=        Build.VERSION_CODES.GINGERBREAD) {
                    mCamera = Camera.open(0);
                } else {
                    mCamera = Camera.open();
                }
                mCamera.setErrorCallback(new ErrorCallback() {

                    @Override
                    public void onError(int error, Camera camera) {
                        isCanAutoFouce = false;
                        CameraActivity.this.setResult(ERROR_KEY);
                        CameraActivity.this.finish();
                    }
                });
                setFocusAreaDefault();
            }
        } catch (Throwable e) {
            runExceptionHandle(e);
        }
    }

您能帮助我吗,谢谢。

我发现日志和发布的代码至少有三个可能的问题:

  • 你可能想

  • 日志似乎引用了从
    cameraRelease()
    方法调用的
    Camera\setPreviewCallback()
    ,该方法未显示在发布的代码中。可能实际运行的代码日志是发布代码的旧版本

  • 似乎您是通过某种错误处理到达
    cameraRelease()
    代码的。可能是由于某些非法状态,触发
    cameraRelease()
    代码的错误可能已经释放了摄像头,因此此方法中的任何调用,例如
    mCamera.stopReview()
    mCamera.setPreviewCallback(null)
    如果此时已释放摄像头,则调用可能会失败


  • 您需要在
    mCamera.stopReview()和
    mCamera.release()之间添加
    mCamera.setPreviewCallback(null)
    。这样,您可以取消任何即将到来的回调


    我提供了一个完整的
    cameraRelease
    方法

    我遇到了类似的问题。这条线是关键线

    com.qihoo360.mobilesafe.loader.b.callActivityOnResume

    从上面的日志中可以看出,奇虎360移动安全禁用了摄像头权限。在
    Camera.open()
    之后,尽管相机正常返回,但相机会立即释放。因此,您应该在
    Camera.open()
    之后检查并捕获错误


    作为第三方应用程序,奇虎360移动安全如何做到这一点?它如何执行权限管理?这个问题使我困惑。它是否利用系统中的未知错误来执行此操作?

    看起来您有两个不同的堆栈跟踪同时运行。你能澄清堆栈跟踪吗?(也就是说,为什么在中间的方法称为“释放后())?)
    try {
         Camera camera = Camera.open();
         if (camera != null) {
             cmaera.getParamters(); // empty operation
         }
    } catch (Exception e) {
        e.printStackTrack()
        // oops, finish activity
    }