【问题标题】:Open camera inside fragment在片段内打开相机
【发布时间】:2015-08-25 13:29:25
【问题描述】:

是否可以在fragment 类似视图中使用相机,这样它就不会打开另一个应用并离开我的特殊应用?

我想要像 SurfaceView 这样的带摄像头的东西?

【问题讨论】:

    标签: android camera fragment android-camera


    【解决方案1】:

    是的,检查这个link

    基本上覆盖SurfaceView并整合camera picture callback

    示例代码:

    /* Surface on which the camera projects it's capture results.
    */
    class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
            SurfaceHolder mHolder;
            Camera mCamera;
    
            public CameraPreview(Context context, Camera camera) {
                super(context);
                mCamera = camera;
    
                // 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 {
                    mCamera.setPreviewDisplay(holder);
                    mCamera.startPreview();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            public void surfaceDestroyed(SurfaceHolder holder) {
                // empty. Take care of releasing the Camera preview in your activity.
            }
    
            public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
                // 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
                }
    
                // set preview size and make any resize, rotate or
                // reformatting changes here
    
                // start preview with new settings
                try {
                    mCamera.setPreviewDisplay(mHolder);
                    mCamera.startPreview();
    
                } catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    

    带有摄像头图片回调,例如:

    private Camera.PictureCallback mPicture = new Camera.PictureCallback() {
    
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
    
                File pictureFile = getOutputMediaFile();
                if (pictureFile == null){
                    Toast.makeText(getActivity(), "Image retrieval failed.", Toast.LENGTH_SHORT)
                    .show();
                    return;
                }
    
                try {
                    FileOutputStream fos = new FileOutputStream(pictureFile);
                    fos.write(data);
                    fos.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
    

    【讨论】:

    • 有缺陷...缺少默认构造函数的参数和以编程方式实现视图,因为通过 XML 调用一个平淡无奇的构造函数。
    【解决方案2】:

    原生实现要好得多。

    XML

    <com.google.android.cameraview.CameraView
    android:id="@+id/camera"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:keepScreenOn="true"
    android:adjustViewBounds="true"
    app:autoFocus="true"
    app:aspectRatio="4:3"
    app:facing="back"
    app:flash="auto"/>
    

    内部活动/片段

    启动相机

      mCameraView.start();
    

    停止相机

      mCameraView.stop();
    

    Open source: Google

    需要 API 级别 9。该库使用 API 级别 9-20 的 Camera 1 API 和 21 及更高级别的 Camera2。

    【讨论】:

    • 这太棒了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多