Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.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_Deprecated_Android Camera2 - Fatal编程技术网

Android摄像头已弃用

Android摄像头已弃用,android,camera,deprecated,android-camera2,Android,Camera,Deprecated,Android Camera2,我有一个Android应用程序,它能够使用不推荐的硬件,在SurfaceView中拍摄一张简单的预览照片 我是这样做的: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.primeracapa); ajustes = getSharedPreferences("ajustes", MODE_P

我有一个Android应用程序,它能够使用不推荐的
硬件,在
SurfaceView
中拍摄一张简单的预览照片

我是这样做的:

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

    setContentView(R.layout.primeracapa);

    ajustes = getSharedPreferences("ajustes", MODE_PRIVATE);

    mySurfaceView = (SurfaceView) findViewById(R.id.surface);
    mySurfaceHolder = mySurfaceView.getHolder();
    mySurfaceHolder.addCallback(this);

    myInflater = LayoutInflater.from(this);
    View overView = myInflater.inflate(R.layout.segundacapa,null);
    this.addContentView(overView, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));

    takePicture = (Button) findViewById(R.id.button);
    takePicture.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if(capturar==true || !ajustes.getBoolean("longitudAuto", true))
            {
                myCamera.takePicture(myShutterCallback, myPictureCallback, myJpeg);
            }
        }
    });
}

ShutterCallback myShutterCallback = new ShutterCallback() {
    @Override
    public void onShutter() {
    }
};

PictureCallback myPictureCallback = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera myCamera) {
        // Despues de hacer la foto que tiene que hacer
    }
};

PictureCallback myJpeg = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera myCamera) {
        if(data != null){

            File dir_image2 = new File (Environment.getExternalStoragePublicDirectory
                    (Environment.DIRECTORY_DCIM), "foto");
            dir_image2.mkdirs();

            File tmpFile = new File(dir_image2,"TempGhost.jpg");

            try 
            {  
                FileOutputStream fos = new FileOutputStream(tmpFile);
                fos.write(data);
                fos.close();
            } catch (FileNotFoundException e) {
                Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
            } catch (IOException e) {
                Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
            }

            if (!dir_image2.mkdirs()) {
                Log.e("TAG", "Directory not created");
            }
        }
    }
};


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    try{
        if(myPreviewRunning){
            myCamera.stopPreview();
            myPreviewRunning = false;
        }
        Camera.Parameters p = myCamera.getParameters();
        p.setJpegQuality(50);
        p.setPreviewSize(width,height);

        myCamera.setParameters(p);
        myCamera.setPreviewDisplay(holder);
        myCamera.startPreview();
        myPreviewRunning = true;
    }catch(Exception e){}
}

@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
    myCamera.stopPreview();
    myPreviewRunning = false;
    myCamera.release();
    myCamera = null;
}

@Override
public void surfaceCreated(SurfaceHolder holder) 
{
    myCamera = Camera.open();
}

现在我需要做的是使用camera2做同样“简单”的事情,这让我发疯。camera2是否可能更难使用。
我只需要在我的
SurfaceView上查看相机的预览,并能够在按下按钮时拍摄照片,并将其保存在我创建的特定文件夹中。

也在使用相机2,但我的情况是视频预览。 也许你不需要重复的请求,只需要简单的请求。希望这能帮助你从一开始

CameraManager manager = (CameraManager)context.getSystemService(Context.CAMERA_SERVICE);
      if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        try {
          manager.openCamera(cameraId, new CameraDevice.StateCallback() {


                @Override
                public void onOpened(@NonNull CameraDevice camera) {
                    try {

                        CaptureRequest.Builder builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
                        builder.set(CaptureRequest.CONTROL_MODE,CaptureRequest.CONTROL_MODE_USE_SCENE_MODE);
                        builder.set(CaptureRequest.CONTROL_SCENE_MODE,CaptureRequest.CONTROL_SCENE_MODE_PORTRAIT);

                        builder.addTarget(preview);
                        final CaptureRequest req = builder.build();

                        camera.createCaptureSession(Arrays.asList(preview), new CameraCaptureSession.StateCallback() {
                            @Override
                            public void onConfigured(@NonNull CameraCaptureSession session) {
                                try {

                                    currentSession = session;
                                    session.setRepeatingRequest(req, new CameraCaptureSession.CaptureCallback() {
                                    },new Handler());
                                } catch (CameraAccessException e) {
                                    e.printStackTrace();
                                }
                            }

                            @Override
                            public void onConfigureFailed(@NonNull CameraCaptureSession session) {
                                //do something
                            }
                        },new Handler());
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onDisconnected(@NonNull CameraDevice camera) {
                    camera.close();

                }

                @Override
                public void onError(@NonNull CameraDevice camera, int error) {

                }
            }, new Handler());
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }

“现在我需要做的是使用camera2做同样“简单”的事情——为什么<代码>摄像头
将持续工作数年,以实现向后兼容性。“camera2是否可能更难使用”--是的,它更难使用。我认为不使用不推荐使用的元素是最佳实践。对不推荐使用的元素有一个清晰的计划是最佳实践。在某些情况下,转移到其他方面是相当容易的,并且可能会产生更好的结果。在其他情况下,比如这一次,转移到其他地方是一种严重的痛苦,因此你可能会推迟。毕竟,在这种情况下,如果您的
minSdkVersion
低于21,您仍然需要
Camera
代码,因为早期版本的android上不存在
android.hardware.camera2