Android摄像头拍照没问题摄像头、问题、Android

2023-09-13 02:21:37 作者:一生换取一滴泪

我使用的有瑞芯微,cs968a Android系统的智能电视盒。 我无法捕捉到的图像。 它抛出一个错误与此设备在运行时

下面是code我使用的:

 包com.android.camerarecorder;

    进口的java.io.File;
    进口java.io.FileNotFoundException;
    进口java.io.FileOutputStream中;
    进口java.io.IOException异常;
    进口java.text.SimpleDateFormat的;
    进口java.util.Date;

    进口android.content.Context;
    进口android.content.pm.PackageManager;
    进口android.hardware.Camera;
    进口android.hardware.Camera.CameraInfo;
    进口android.hardware.Camera.PictureCallback;
    进口android.os.Environment;
    进口android.util.Log;
    进口android.view.SurfaceView;

    公共类CameraController {

        私人上下文的背景下;

        私人布尔hasCamera;

        私人摄像头摄像头;
        私人诠释cameraId;

        公共CameraController(上下文C){
            上下文= c.getApplicationContext();

            如果(context.getPackageManager()。hasSystemFeature(PackageManager.FEATURE_CAMERA)){
                cameraId = getFrontCameraId();

                如果(cameraId!= -1){
                    hasCamera = TRUE;
                }其他{
                    hasCamera = FALSE;
                }
            }其他{
                hasCamera = FALSE;
            }
        }

        公共布尔hasCamera(){
            返回hasCamera;
        }

        公共无效getCameraInstance(){
            摄像头= NULL;

            如果(hasCamera){
                尝试{
                  //摄像头= Camera.open(cameraId);
                     摄像头= Camera.open(cameraId);
                    prepareCamera();
                }
                赶上(例外五){
                    hasCamera = FALSE;
                }
            }
        }

        公共无效takePicture(){
            如果(hasCamera){
                camera.takePicture(NULL,NULL,mPicture);
            }
        }

        公共无效releaseCamera(){
            如果(相机!= NULL){
                camera.stop preVIEW();
                camera.release();
                摄像头= NULL;
            }
        }

        私人诠释getFrontCameraId(){
            INT CAMID = -1;
            INT numberOfCameras = Camera.getNumberOfCameras();
            CameraInfo CI =新CameraInfo();

            的for(int i = 0; I< numberOfCameras;我++){
                Camera.getCameraInfo(I,CI);
                如果(ci.facing == CameraInfo.CAMERA_FACING_FRONT){
                    CAMID =我;
                }
            }

            返回CAMID;
        }

        私人无效prepareCamera(){
            SurfaceView视图=新SurfaceView(上下文);

            尝试{
                camera.set previewDisplay(view.getHolder());
            }赶上(IOException异常E){
                抛出新的RuntimeException(E);
            }

            camera.start preVIEW();

            Camera.Parameters PARAMS = camera.getParameters();
            params.setJpegQuality(100);

            camera.setParameters(PARAMS);
        }

        私人PictureCallback mPicture =新PictureCallback(){
            @覆盖
            公共无效onPictureTaken(byte []的数据,摄像头摄像头){
                文件PictureFile的= getOutputMediaFile();

                如果(PictureFile的== NULL){
                    Log.d(TEST,错误创建的媒体文件,检查存储权限);
                    返回;
                }

                尝试{
                    Log.d(TEST,文件创建);
                    FileOutputStream中FOS =新的FileOutputStream(PictureFile的);
                    fos.write(数据);
                    fos.close();
                }赶上(FileNotFoundException异常E){
                    Log.d(TEST,找不到文件:+ e.getMessage());
                }赶上(IOException异常E){
                    Log.d(TEST,访问文件时出错:+ e.getMessage());
                }
            }
        };

        私人文件getOutputMediaFile(){
            //为了安全起见,你应该检查SD卡安装
            //在此之前使用Environment.getExternalStorageState()。

            文件mediaStorageDir =新的文件(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),MyCameraApp);

            //这个位置效果最好,如果你希望共享的创建的图像
            //应用程序之间,坚持后,您的应用程序已被卸载。

            //创建存储目录,如果它不存在
            如果(!mediaStorageDir.exists()){
                如果(!mediaStorageDir.mkdirs()){
                    返回null;
                }
            }

            //创建一个媒体文件名
            字符串的timeStamp =新的SimpleDateFormat(YYYYMMDD_HHMMSS)格式(新的Date())。

            文件媒体文件;
            媒体文件=新的文件(mediaStorageDir.getPath()+文件分割符+IMG _+的timeStamp +。JPG);

            返回媒体文件;
        }
    }
 

解决方案

我发现,我现在用的设备将不会与

工作

com.android.hardware.camera

我通过开发DOC,发现以上版本21这个API是德precated

手机拍照大学问 摄像头参数解读

现在从那里他们正在使用

com.android.hardware.camera2 包含一些不同类型的相机要求

I am Using Android Smart TV box having Rockchip-cs968a. I am not able to capture image. It throws an error with this device at runtime

Here is the code I am using:

package com.android.camerarecorder;

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.hardware.Camera;
    import android.hardware.Camera.CameraInfo;
    import android.hardware.Camera.PictureCallback;
    import android.os.Environment;
    import android.util.Log;
    import android.view.SurfaceView;

    public class CameraController {

        private Context context;

        private boolean hasCamera;

        private Camera camera;
        private int cameraId;

        public CameraController(Context c){
            context = c.getApplicationContext();

            if(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
                cameraId = getFrontCameraId();

                if(cameraId != -1){
                    hasCamera = true;
                }else{
                    hasCamera = false;
                }
            }else{
                hasCamera = false;
            }
        }

        public boolean hasCamera(){
            return hasCamera;
        }

        public void getCameraInstance(){
            camera = null;

            if(hasCamera){
                try{
                  //  camera = Camera.open(cameraId);
                     camera = Camera.open(cameraId);
                    prepareCamera();
                }
                catch(Exception e){
                    hasCamera = false;
                }
            }
        }

        public void takePicture(){
            if(hasCamera){
                camera.takePicture(null,null,mPicture);
            }
        }

        public void releaseCamera(){
            if(camera != null){
                camera.stopPreview();
                camera.release();
                camera = null;
            }
        }

        private int getFrontCameraId(){
            int camId = -1;
            int numberOfCameras = Camera.getNumberOfCameras();
            CameraInfo ci = new CameraInfo();

            for(int i = 0;i < numberOfCameras;i++){
                Camera.getCameraInfo(i,ci);
                if(ci.facing == CameraInfo.CAMERA_FACING_FRONT){
                    camId = i;
                }
            }

            return camId;
        }

        private void prepareCamera(){
            SurfaceView view = new SurfaceView(context);

            try{
                camera.setPreviewDisplay(view.getHolder());
            }catch(IOException e){
                throw new RuntimeException(e);
            }

            camera.startPreview();

            Camera.Parameters params = camera.getParameters();
            params.setJpegQuality(100);

            camera.setParameters(params);  
        }

        private PictureCallback mPicture = new PictureCallback(){
            @Override
            public void onPictureTaken(byte[] data, Camera camera){
                File pictureFile = getOutputMediaFile();

                if(pictureFile == null){
                    Log.d("TEST", "Error creating media file, check storage permissions");
                    return;
                }

                try{
                    Log.d("TEST","File created");
                    FileOutputStream fos = new FileOutputStream(pictureFile);
                    fos.write(data);
                    fos.close();
                }catch(FileNotFoundException e){
                    Log.d("TEST","File not found: "+e.getMessage());
                } catch (IOException e){
                    Log.d("TEST","Error accessing file: "+e.getMessage());
                }
            }
        };

        private File getOutputMediaFile(){
            // To be safe, you should check that the SDCard is mounted
            // using Environment.getExternalStorageState() before doing this.

            File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"MyCameraApp");

            // This location works best if you want the created images to be shared
            // between applications and persist after your app has been uninstalled.

            // Create the storage directory if it does not exist
            if(!mediaStorageDir.exists()){
                if(!mediaStorageDir.mkdirs()){
                    return null;
                }
            }

            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());

            File mediaFile;
            mediaFile = new File(mediaStorageDir.getPath()+File.separator+"IMG_"+timeStamp+".jpg");

            return mediaFile;
        }
    }

解决方案

I have found that the device i am using will not work with

com.android.hardware.camera

i go through developers DOC and found that version above 21 this api is deprecated

now from there they are using

com.android.hardware.camera2 contain some different type of camera calling