Android Studio:takePicture错误

时间:2017-02-26 18:03:35

标签: java android camera

我对 Android Studio 中的adb logcat 方法有疑问。 我见过很多教程,但没有一个能帮到我。请帮帮我:0 这是我的代码:

react-native log-ios
react-native log-android

清单权限

takePicture();

此处错误代码

Button button;
Camera cam = null;

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

    cam = Camera.open();

    button = (Button) findViewById(R.id.getrange);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            cam.startPreview();
            cam.takePicture(null, null, null, mPicture);
        }
    });

}

public static Camera.PictureCallback mPicture = new Camera.PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        File dir = new File(Environment.getExternalStorageDirectory(), "Bewegungsmelder-App");
        dir.mkdirs();

        File file = new File(dir, "IMG_" + System.currentTimeMillis() + ".jpg");

        if (file == null) {
            return;
        }

        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(data);
            fos.close();
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        }
    }
};

@Override
protected void onPause() {
    super.onPause();

    cam.stopPreview();
    cam.release();
    cam = null;
}

@Override
protected void onResume() {
    super.onResume();

    cam = Camera.open();
}

感谢你的帮助D:
PS:Bewegungsmelder是德国人。它意味着运动检测器!

1 个答案:

答案 0 :(得分:0)

startService()方法中拨打startPreview,并在onPictureTaken

中调用onClick
public static Camera.PictureCallback mPicture = new Camera.PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        File dir = new File(Environment.getExternalStorageDirectory(), "Bewegungsmelder-App");
        dir.mkdirs();

        File file = new File(dir, "IMG_" + System.currentTimeMillis() + ".jpg");
        if (file == null) {
            return;
        }

        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(data);
            fos.close();
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        }
        camera.startPreview();
    }
};

原因是一旦拍照,当前的预览就会被破坏,以便下次拍照时需要重新开始拍摄。

编辑:除了在致电startPreview之前致电takePicture之外,您已经忘记的另一件重要事情是,根据Android documentation point #5,您没有#&# 39;将surfaceHolder传递给setPreviewDispaly(SurfaceHolder)。首先,将SurfaceView添加到XML布局,并将id设置为preview。其次,将SurfaceHolder变量和SurfaceView变量添加到类的顶部,

SurfaceHolder surfaceHolder;
SurfaceView surfaceView;

然后在onCreate中,初始化变量,如此,

surfaceView = (SurfaceView) findViewById(R.id.preview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(surfaceCallback);    
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

现在,为surfaceHolder

进行回调
SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback(){

    public void surfaceCreated(SurfaceHolder holder) {     
        try {        
            cam.setPreviewDisplay(surfaceHolder); 
        } catch (Throwable t) {   

        }     
    }      

    public void surfaceChanged(SurfaceHolder holder,int format, int width,int height) {
        Camera.Parameters params = cam.getParameters();       
        params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
        Camera.Size size = getBestPreviewSize(width, height, params);  
        Camera.Size pictureSize = getSmallestPictureSize(params);
        if (size != null && pictureSize != null) {      
            params.setPreviewSize(size.width, size.height);
            params.setPictureSize(pictureSize.width,
                    pictureSize.height);
            cam.setParameters(params);       
            cam.startPreview();                      

        }     
    }      

    public void surfaceDestroyed(SurfaceHolder holder) {
        cam.stopPreview();
    }   
};

完成所有这些后,我不相信您需要startPreview中的onClick来电。但是,我认为为了使其工作,您可能必须使cam成为静态变量以及其他变量。不是100%肯定。