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。。。我帮不上忙