Open camera inside fragment

后端 未结 2 1263
庸人自扰
庸人自扰 2021-02-15 14:53

Is it possible to use camera in fragment like view, so that it wouldn\'t open another app and go away from my special app?

I want something

相关标签:
2条回答
  • 2021-02-15 15:30

    Native implementation is way better.

    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"/>
    

    Inside Activity/Fragment

    Start camera

      mCameraView.start();
    

    Stop camera

      mCameraView.stop();
    

    Open source: Google

    Requires API Level 9. The library uses Camera 1 API on API Level 9-20 and Camera2 on 21 and above.

    0 讨论(0)
  • 2021-02-15 15:31

    Yes it is, Check this link .

    Basically overwritting the SurfaceView and integrating the camera picture callback.

    example code :

    /* 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();
                }
            }
        }
    

    with a camera picture callback like:

    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();
                }
            }
        };
    
    0 讨论(0)
提交回复
热议问题