Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.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_Android Camera_Front Camera - Fatal编程技术网

Android前置摄像头图像未正确保存

Android前置摄像头图像未正确保存,android,android-camera,front-camera,Android,Android Camera,Front Camera,我想申请自拍我捕获了图像并将其保存在前摄像头中。但“多媒体资料”或“文件管理器”中的图像未打开。 “无法加载图像”此消息即将出现。如果我将标志从前置摄像头更改为后置摄像头,它将正常工作。 public class Preview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private Camera mCamera; private Con

我想申请自拍我捕获了图像并将其保存在前摄像头中。但“多媒体资料”或“文件管理器”中的图像未打开。 “无法加载图像”此消息即将出现。如果我将标志从前置摄像头更改为后置摄像头,它将正常工作。

public class Preview extends SurfaceView implements SurfaceHolder.Callback {

    private SurfaceHolder mHolder;
    private Camera mCamera;
    private Context context;
    private String TAG = "Preview";

    public Preview(Camera mCamera, Context context) {
        super(context);

        this.mCamera = mCamera;
        this.context = context;

        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {

    }

    @Override
    public void surfaceCreated(SurfaceHolder mHolder) {
        safeCameraOpen();
        if (mCamera != null) {
            try {
                mCamera.setPreviewDisplay(mHolder);
                mCamera.startPreview();

            } catch (IOException e) {
                Log.d(TAG, "Error setting camera preview: " + e.getMessage());
                mCamera.release();
                mCamera = null;
            }
        } else {
            Log.d(TAG, "Error in camera  : ");
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        if (mCamera != null) {
            setCameraDisplayOrientation((Activity) context, mCamera);
        }

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        releaseCameraAndPreview();
    }

    // This method is called while clicking for selfie
    public void captureImage() {
        mCamera.takePicture(null, null, mPicture);
    }

    Camera.PictureCallback mPicture = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
           saveImage(data);
        }
    };

    public void saveImage(byte[] data) {
        try {
            File imageFile = createImageFile();

            if (imageFile != null) {
                FileOutputStream fos = new FileOutputStream(imageFile);
                fos.write(data);
                fos.close();
                Toast.makeText(context, "New Image saved", Toast.LENGTH_LONG).show();

            } else {
                Toast.makeText(context, "Directory problem", Toast.LENGTH_LONG).show();

            }
        } catch (Exception error) {
            error.getMessage();
            Toast.makeText(context, "Image could not be saved.", Toast.LENGTH_LONG).show();
        }
    }

    private File createImageFile() throws IOException {
        // Create an image file name
        File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Selfie");
        if (!storageDir.exists() && !storageDir.mkdirs()) {

            Log.d(TAG, "Can't create directory to save image.");
            Toast.makeText(context, "Can't create directory to save image.", Toast.LENGTH_LONG).show();
            return null;

        }
        File image = File.createTempFile(String.valueOf(System.currentTimeMillis()),  /* prefix */ ".jpg", /* suffix */ storageDir /* directory */);

        return image;
    }


    private boolean safeCameraOpen() {
        boolean qOpened = false;

        try {
            releaseCameraAndPreview();
            mCamera = openFrontFacing();
            qOpened = (mCamera != null);
        } catch (Exception e) {

            e.printStackTrace();
        }

        return qOpened;
    }

    public void releaseCameraAndPreview() {
        //  mPreview.setCamera(null);
        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
    }

    private Camera openFrontFacing() {
        int cameraCount = 0;
        Camera camera = null;

        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        cameraCount = Camera.getNumberOfCameras();
        for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
            Camera.getCameraInfo(camIdx, cameraInfo);
            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                try {
                    camera = Camera.open(camIdx);
                } catch (RuntimeException e) {
                    Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
                }
            }
        }

        return camera;
    }
}
public类预览扩展了SurfaceView实现了SurfaceHolder.Callback{
私人地勤人员;
私人摄像机麦卡梅拉;
私人语境;
私有字符串TAG=“Preview”;
公共预览(摄影机mCamera、上下文){
超级(上下文);
this.mCamera=mCamera;
this.context=上下文;
mHolder=getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE\u TYPE\u PUSH\u缓冲区);
}
@凌驾
仅受保护的void布局(布尔值已更改、int l、int t、int r、int b){
}
@凌驾
已创建的公共空隙表面(表面处理层){
safeCameraOpen();
if(mCamera!=null){
试一试{
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
}捕获(IOE异常){
Log.d(标记“错误设置相机预览:”+e.getMessage());
mCamera.release();
mCamera=null;
}
}否则{
Log.d(标签“摄像机中的错误:”);
}
}
@凌驾
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
if(mCamera!=null){
setCameraRadisPlayOrientation((活动)上下文,mCamera);
}
}
@凌驾
公共空间表面覆盖(表面覆盖物持有人){
释放摄影机和预览();
}
//单击自拍时调用此方法
公共无效captureImage(){
takePicture(null,null,mPicture);
}
Camera.PictureCallback mPicture=新建Camera.PictureCallback(){
@凌驾
公共void onPictureTaken(字节[]数据,摄像头){
保存图像(数据);
}
};
公共void saveImage(字节[]数据){
试一试{
File imageFile=createImageFile();
if(imageFile!=null){
FileOutputStream fos=新的FileOutputStream(imageFile);
写入(数据);
fos.close();
Toast.makeText(上下文,“保存新图像”,Toast.LENGTH_LONG.show();
}否则{
Toast.makeText(上下文,“目录问题”,Toast.LENGTH_LONG.show();
}
}捕获(异常错误){
错误。getMessage();
Toast.makeText(上下文,“图像无法保存”,Toast.LENGTH_LONG.show();
}
}
私有文件createImageFile()引发IOException{
//创建图像文件名
File storageDir=新文件(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),“Selfie”);
如果(!storageDir.exists()&&!storageDir.mkdirs()){
d(标记“无法创建保存图像的目录”);
Toast.makeText(上下文,“无法创建保存图像的目录。”,Toast.LENGTH_LONG.show();
返回null;
}
File image=File.createTempFile(String.valueOf(System.currentTimeMillis()),/*前缀*/“.jpg”,/*后缀*/storageDir/*目录*/);
返回图像;
}
私有布尔值safeCameraOpen(){
布尔qOpened=false;
试一试{
释放摄影机和预览();
mCamera=openFrontFacing();
qOpened=(mCamera!=null);
}捕获(例外e){
e、 printStackTrace();
}
返回qOpened;
}
公共无效发布CameraandPreview(){
//mPreview.setCamera(空);
if(mCamera!=null){
mCamera.stopPreview();
mCamera.release();
mCamera=null;
}
}
专用摄像头openFrontFacing(){
int cameraCount=0;
摄像头=空;
Camera.CameraInfo CameraInfo=新的Camera.CameraInfo();
cameraCount=Camera.getNumberOfCameras();
对于(int-camIdx=0;camIdx

openFrontFacing()
方法中,如果我将
CAMERA\u-FACING\u-FRONT
更改为
CAMERA\u-FACING\u-BACK
它工作正常

每个摄像头都有一些支持的预览尺寸和图片尺寸,您必须设置正确的尺寸。搜索mCamera.getParameters().getSupportedPictureSizes()主题稍微长一点;和mCamera.getParameters().getSupportedPreviewSizes()

尝试在不同的设备上运行该应用程序。谢谢,它在其他手机上工作。但是你能告诉我在其他设备或版本上工作的其他方法吗?在那个特定的设备上可能有一个bug。。。我帮不上忙