Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.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
Java Android摄像头预览突然冻结_Java_Android_Camera - Fatal编程技术网

Java Android摄像头预览突然冻结

Java Android摄像头预览突然冻结,java,android,camera,Java,Android,Camera,在官方developer.android.com教程的帮助下,我实现了一个android摄像头。该应用程序有时工作正常,但大约有3/5倍的相机预览会在旋转和点击按钮后冻结,甚至在没有这些功能的情况下(其他元素不会冻结)。最有趣的是,当我调试应用程序时,预览不会卡住,但当我想正常运行应用程序时,有时会出现问题 这是我的全屏类,它由android studio为全屏活动生成的代码和实现surfaceHolder.Callback和camera之类的代码组成 public class CameraAc

在官方developer.android.com教程的帮助下,我实现了一个android摄像头。该应用程序有时工作正常,但大约有3/5倍的相机预览会在旋转和点击按钮后冻结,甚至在没有这些功能的情况下(其他元素不会冻结)。最有趣的是,当我调试应用程序时,预览不会卡住,但当我想正常运行应用程序时,有时会出现问题

这是我的全屏类,它由android studio为全屏活动生成的代码和实现surfaceHolder.Callback和camera之类的代码组成

public class CameraActivity extends Activity implements SurfaceHolder.Callback {

...   // some constants here
    private Camera mCamera;
    private SurfaceHolder mHolder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_camera);

        SurfaceView cameraSufaceView = (SurfaceView) findViewById(R.id.camera_preview);

        // Accessing front camera to take picture
        mCamera = openFrontFacingCameraGingerbread();

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

        } else {
            // Alter user
        }

    /**
     * Gets an instance of front facing camera if available
     */
    @SuppressWarnings("deprecation")
    private Camera openFrontFacingCameraGingerbread() {
        int cameraCount;
        Camera cam = null;
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        cameraCount = Camera.getNumberOfCameras();
        for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
            Camera.getCameraInfo(camIdx, cameraInfo);
            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                try {
                    cam = Camera.open(camIdx);
                } catch (RuntimeException e) {
                    Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
                }
            }
        }

        return cam;
    }

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

    }

    @Override
    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
        }

        // start preview with new settings
        try {
//            mCamera.setDisplayOrientation(needs degree here);
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

        } catch (Exception e) {
            Log.d(TAG, "Error starting camera preview: " + e.getMessage());
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        releaseCamera();
    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseCamera();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mCamera == null)
            mCamera = openFrontFacingCameraGingerbread();
    }

    private void releaseCamera() {
        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.release();        // release the camera for other applications
            mCamera = null;
        }
    }

到目前为止,我发现的唯一线索是,有时即使活动没有暂停,android也会调用onPause方法。为了再次获取摄像头的实例,我在onResume方法中调用了
OpenFrontFacingCameragingerRead()

@JordiCastilla我尊重你的意见,但如果你能提供更多有关问题的信息,那就太好了。我不会阅读你所有凌乱的代码,阅读文章并学习如何提问。。。如果你不这样做,那么就不是这个问题的地方。@JordiCastilla我让代码更简单了。现在好点了吗?不,不是,我让你看这篇文章。。。。是吗???包含足够的代码以允许其他人重现问题。关于这方面的帮助,请阅读如何创建@JordiCastilla我尊重你的意见,但如果你能提供更多有关问题的信息,那就太好了。我不会阅读你所有的乱七八糟的代码,阅读文章并学习如何提问。。。如果你不这样做,那么就不是这个问题的地方。@JordiCastilla我让代码更简单了。现在好点了吗?不,不是,我让你看这篇文章。。。。是吗???包含足够的代码以允许其他人重现问题。有关这方面的帮助,请阅读如何创建
26893-26893/com.naviiid.retinaflash E/art﹕ No implementation found for void java.lang.Runtime.appStartupEnd() (tried Java_java_lang_Runtime_appStartupEnd and Java_java_lang_Runtime_appStartupEnd__)
09-16 01:34:09.336  26893-26893/com.naviiid.retinaflash E/ActivityThread﹕ appStartupEnd :
    java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java)
            at android.app.ActivityThread.appStartupEnd(ActivityThread.java:305)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2819)
            at android.app.ActivityThread.access$900(ActivityThread.java:177)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5942)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
     Caused by: java.lang.UnsatisfiedLinkError: No implementation found for void java.lang.Runtime.appStartupEnd() (tried Java_java_lang_Runtime_appStartupEnd and Java_java_lang_Runtime_appStartupEnd__)
            at java.lang.Runtime.appStartupEnd(Native Method)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java)
            at android.app.ActivityThread.appStartupEnd(ActivityThread.java:305)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2819)
            at android.app.ActivityThread.access$900(ActivityThread.java:177)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5942)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)