Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.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_Camera - Fatal编程技术网

Android 更改方向会导致相机破坏其当前活动,然后重新创建

Android 更改方向会导致相机破坏其当前活动,然后重新创建,android,camera,Android,Camera,我正在使用自定义相机拍摄图像,并支持我编写的两个不同的XML的所有设备和屏幕方向 一个用于纵向模式(在分辨率>布局下),第二个用于横向模式(在分辨率>布局地下) 例如: 我的相机已初始化,我已准备好拍摄/捕获图像------->但我的相机预览模式仍为横向模式 现在我决定使用纵向模式拍摄图像(因此我将相机的旋转方向从横向模式更改为纵向模式),但是在以纵向模式启动相机之前,其关闭和打开相机镜头。。。。。(简而言之,重新初始化我的相机) CameraLauncherActivity.java:- @O

我正在使用自定义相机拍摄图像,并支持我编写的两个不同的XML的所有设备和屏幕方向

一个用于纵向模式(在分辨率>布局下),第二个用于横向模式(在分辨率>布局地下)

例如:

  • 我的相机已初始化,我已准备好拍摄/捕获图像------->但我的相机预览模式仍为横向模式

  • 现在我决定使用纵向模式拍摄图像(因此我将相机的旋转方向从横向模式更改为纵向模式),但是在以纵向模式启动相机之前,其关闭和打开相机镜头。。。。。(简而言之,重新初始化我的相机)

  • CameraLauncherActivity.java:-

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_camera);
    
             mCamera = getCameraInstance();
    
                mCameraPreview = new PreviewSurface(this, mCamera);
                FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
                preview.addView(mCameraPreview);
    
                Button captureButton = (Button) findViewById(R.id.btnCapture);
                Log.d(CameraLauncherActivity.LOG_TAG, "captureButton :: " + captureButton);
                captureButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mCamera.takePicture(null, null, mPicture);
                        Log.d(CameraLauncherActivity.LOG_TAG, "mCamera.takePicture :: " + mCamera);                                         
                    }
                });
                      }
              private Camera getCameraInstance() {
    
            Camera camera = null;
            Log.d(CameraLauncherActivity.LOG_TAG, "getCameraInstance()Camera:: " + camera);
            try {
                camera = Camera.open(0);
                Log.d(CameraLauncherActivity.LOG_TAG, "getCameraInstance()open:: " + camera);
            } catch (Exception e) {
                // cannot get camera or does not exist
            }
            if(camera!=null){
             // get supported sizes:
             // List<Size> localSizes = camera.getParameters().getSupportedPreviewSizes();
             // loop through localSizes to get closest size
             Camera.Parameters parameters = camera.getParameters();
             parameters.setPreviewSize(640, 480);
             camera.setParameters(parameters);
            }
            return camera;
        }
    
        PictureCallback mPicture = new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                pictureFile = getOutputMediaFile();
                camera.startPreview();
                if (pictureFile == null) {
                    return;
                }
                try {
                    FileOutputStream fos = new FileOutputStream(pictureFile);
                    fos.write(data);
                    fos.close();
                } catch (FileNotFoundException e) {
    
                } catch (IOException e) {
                }
            }
        };
    
     public class PreviewSurface extends SurfaceView implements
    SurfaceHolder.Callback {
    
        public static final String LOG_TAG = "CameraPreview";
        private SurfaceHolder mSurfaceHolder;
    
        private Camera mCamera;
    
        // Constructor that obtains context and camera
        @SuppressWarnings("deprecation")
        public PreviewSurface(Context context, Camera camera) {
            super(context);
            this.mCamera = camera;
    
            this.mSurfaceHolder = this.getHolder();
            this.mSurfaceHolder.addCallback(this);
            this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            this.mSurfaceHolder.setFixedSize(100, 100);
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder surfaceHolder) {
            try {       
                Camera.Parameters parameters = mCamera.getParameters();
                if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) 
                {
                     parameters.set("orientation", "portrait");
                     mCamera.setDisplayOrientation(90);
                     parameters.setRotation(90);
                     mCamera.setPreviewDisplay(surfaceHolder);
                     mCamera.startPreview();
                }
                else 
                {
                     // This is an undocumented although widely known feature
                     parameters.set("orientation", "landscape");
                     // For Android 2.2 and above
                     mCamera.setDisplayOrientation(0);
                     // Uncomment for Android 2.0 and above
                     parameters.setRotation(0);
                }
                mCamera.setPreviewDisplay(surfaceHolder);
                mCamera.startPreview();
    
            } catch (IOException e) {
                // left blank for now
            }
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
            mCamera.stopPreview();
            mCamera.release();
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
                int width, int height) {
    
            try {       
                Camera.Parameters parameters = mCamera.getParameters();
                if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
                     parameters.set("orientation", "portrait");
                     mCamera.setDisplayOrientation(90);
                     parameters.setRotation(90);
    
                }
                     else {
                          // This is an undocumented although widely known feature
                          parameters.set("orientation", "landscape");
                          // For Android 2.2 and above
                          mCamera.setDisplayOrientation(0);
                          // Uncomment for Android 2.0 and above
                          parameters.setRotation(0);
                }
                mCamera.setPreviewDisplay(surfaceHolder);
                mCamera.startPreview();
    
            } catch (IOException e) {
                // left blank for now
            }           
        }
    
        <activity
            android:name="com.example.camera.CameraLauncherActivity"
            android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" />
    
    Manifest.xml:-

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_camera);
    
             mCamera = getCameraInstance();
    
                mCameraPreview = new PreviewSurface(this, mCamera);
                FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
                preview.addView(mCameraPreview);
    
                Button captureButton = (Button) findViewById(R.id.btnCapture);
                Log.d(CameraLauncherActivity.LOG_TAG, "captureButton :: " + captureButton);
                captureButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mCamera.takePicture(null, null, mPicture);
                        Log.d(CameraLauncherActivity.LOG_TAG, "mCamera.takePicture :: " + mCamera);                                         
                    }
                });
                      }
              private Camera getCameraInstance() {
    
            Camera camera = null;
            Log.d(CameraLauncherActivity.LOG_TAG, "getCameraInstance()Camera:: " + camera);
            try {
                camera = Camera.open(0);
                Log.d(CameraLauncherActivity.LOG_TAG, "getCameraInstance()open:: " + camera);
            } catch (Exception e) {
                // cannot get camera or does not exist
            }
            if(camera!=null){
             // get supported sizes:
             // List<Size> localSizes = camera.getParameters().getSupportedPreviewSizes();
             // loop through localSizes to get closest size
             Camera.Parameters parameters = camera.getParameters();
             parameters.setPreviewSize(640, 480);
             camera.setParameters(parameters);
            }
            return camera;
        }
    
        PictureCallback mPicture = new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                pictureFile = getOutputMediaFile();
                camera.startPreview();
                if (pictureFile == null) {
                    return;
                }
                try {
                    FileOutputStream fos = new FileOutputStream(pictureFile);
                    fos.write(data);
                    fos.close();
                } catch (FileNotFoundException e) {
    
                } catch (IOException e) {
                }
            }
        };
    
     public class PreviewSurface extends SurfaceView implements
    SurfaceHolder.Callback {
    
        public static final String LOG_TAG = "CameraPreview";
        private SurfaceHolder mSurfaceHolder;
    
        private Camera mCamera;
    
        // Constructor that obtains context and camera
        @SuppressWarnings("deprecation")
        public PreviewSurface(Context context, Camera camera) {
            super(context);
            this.mCamera = camera;
    
            this.mSurfaceHolder = this.getHolder();
            this.mSurfaceHolder.addCallback(this);
            this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            this.mSurfaceHolder.setFixedSize(100, 100);
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder surfaceHolder) {
            try {       
                Camera.Parameters parameters = mCamera.getParameters();
                if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) 
                {
                     parameters.set("orientation", "portrait");
                     mCamera.setDisplayOrientation(90);
                     parameters.setRotation(90);
                     mCamera.setPreviewDisplay(surfaceHolder);
                     mCamera.startPreview();
                }
                else 
                {
                     // This is an undocumented although widely known feature
                     parameters.set("orientation", "landscape");
                     // For Android 2.2 and above
                     mCamera.setDisplayOrientation(0);
                     // Uncomment for Android 2.0 and above
                     parameters.setRotation(0);
                }
                mCamera.setPreviewDisplay(surfaceHolder);
                mCamera.startPreview();
    
            } catch (IOException e) {
                // left blank for now
            }
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
            mCamera.stopPreview();
            mCamera.release();
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
                int width, int height) {
    
            try {       
                Camera.Parameters parameters = mCamera.getParameters();
                if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
                     parameters.set("orientation", "portrait");
                     mCamera.setDisplayOrientation(90);
                     parameters.setRotation(90);
    
                }
                     else {
                          // This is an undocumented although widely known feature
                          parameters.set("orientation", "landscape");
                          // For Android 2.2 and above
                          mCamera.setDisplayOrientation(0);
                          // Uncomment for Android 2.0 and above
                          parameters.setRotation(0);
                }
                mCamera.setPreviewDisplay(surfaceHolder);
                mCamera.startPreview();
    
            } catch (IOException e) {
                // left blank for now
            }           
        }
    
        <activity
            android:name="com.example.camera.CameraLauncherActivity"
            android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" />
    

    对,这就是它的工作方式,关闭活动,破坏表面。但是,如果您认为camera.open()太慢,无法经常调用,则可以将
    camera.release()
    延迟到Activity.onStop()