在表面视图中授予权限后相机无法打开

问题描述 投票:7回答:1

我正在制作自定义相机应用程序。这需要表面视图并在表面视图中打开相机。但是当在棉花糖上运行相同的应用程序时,我正在使用Runtime permission来授予相机权限。我允许对话框消失但黑屏显示,相机无法打开。我也试过在允许后再次调用活动,但它不起作用。

提前致谢。

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    if (preview) {
        camera.stopFaceDetection();
        camera.stopPreview();
        preview = false;
    }

    if (camera != null) {
        preview = true;
        // Parameters
        Parameters parameters = camera.getParameters();
        parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        List<Camera.Size> sizeList = camera.getParameters().getSupportedPreviewSizes();
        bestSize = sizeList.get(0);
        for (int i = 1; i < sizeList.size(); i++) {
            if ((sizeList.get(i).width * sizeList.get(i).height) >
                    (bestSize.width * bestSize.height)) {
                bestSize = sizeList.get(i);
            }
        }
        parameters.setPictureSize(bestSize.width, bestSize.height);
        camera.setParameters(parameters);
        camera.startPreview();
        camera.startFaceDetection();
        camera.setFaceDetectionListener(faceDetectionListener);
    }
}
@Override
public void surfaceCreated(SurfaceHolder holder) {

    customsurfaceview();
}
public void customsurfaceview() {

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        Log.e("PLAYGROUND", "Permission is not granted, requesting");
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 123);
    }
    Log.e("Entered Surace Created", "----------------");
}
public void SetPreview_onSurface() {
    if (camera == null)
        return;


    camera = Camera.open();
    try {
        camera.setPreviewDisplay(surfaceView.getHolder());
    } catch (IOException e) {
        e.printStackTrace();
        Log.e("printStackTrace", "--" + e.getMessage());

    }
    camera_button = (ImageView) findViewById(R.id.camera_button);
    camera_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (capture_chek == 0) {
                camera.cancelAutoFocus();
                camera.takePicture(shutterCallback, null, pictureCallback);
                capture_chek = 1;
            }
        }
    });
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    if (camera != null) {
        camera.release();
        camera = null;
        preview = false;
    }
}
android camera
1个回答
0
投票

我有同样的问题,请看我的例子

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera);

    // grant permission
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA);
        return;
    }

    // ***HERE*** is my error: if camera permission not granted all of below 
    // code will never call

    try {
        mCamera = Camera.open();//you can use open(int) to use different cameras
    } catch (Exception e) {
        Log.d("ERROR", "Failed to get camera: " + e.getMessage());
    }

    // set preview
    if (mCamera != null) {
        mCameraView = new CameraView(this, mCamera);//create a SurfaceView to show camera data
        FrameLayout camera_view = (FrameLayout) findViewById(R.id.camera_view);
        camera_view.addView(mCameraView);//add the SurfaceView to the layout
    }

    //btn to close the application
    ImageButton imgClose = (ImageButton) findViewById(R.id.imgClose);
    imgClose.setOnClickListener(this);
}

然后我创建一个函数initial()来绑定所有init代码,当权限再次授予调用init

public class CameraActivity extends MediaPickerBaseActivity implements View.OnClickListener {
    private static final int REQUEST_PERMISSION_CAMERA = 77;
    private Camera mCamera;
    private CameraView mCameraView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);

        setCancelFlag();

        // grant permission
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA);
            return;
        }
        initial();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_PERMISSION_CAMERA) {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                initial();
            } else {
                // TODO: 5/8/17 show permission denied
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
        }
    }

    /**
     * set cancel state from bundle (default: true)
     *
     * @see #isCancelIntermediate
     * @see #flagCancelIntermediate
     */
    private void setCancelFlag() {
        isCancelIntermediate = getIntent().getBooleanExtra(flagCancelIntermediate, true);
    }

    /**
     * init view and camera
     */
    private void initial() {
        try {
            mCamera = Camera.open();//you can use open(int) to use different cameras
        } catch (Exception e) {
            Log.d("ERROR", "Failed to get camera: " + e.getMessage());
        }

        // set preview
        if (mCamera != null) {
            mCameraView = new CameraView(this, mCamera);//create a SurfaceView to show camera data
            FrameLayout camera_view = (FrameLayout) findViewById(R.id.camera_view);
            camera_view.addView(mCameraView);//add the SurfaceView to the layout
        }

        //btn to close the application
        ImageButton imgClose = (ImageButton) findViewById(R.id.imgClose);
        imgClose.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.imgClose)
            cancel();
    }

    @Override
    public void cancel() {
        finish();
    }

    @Override
    public void sendResult() {

    }
}

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.