如何捕捉图像,并将其保存在SD卡

编程入门 行业动态 更新时间:2024-10-24 16:25:25
本文介绍了如何捕捉图像,并将其保存在SD卡的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

嘿,大家好我用下面的code,从我的应用程序访问的摄像头。 该应用程序能够访问摄像机我还增加了其onclicklistener增加了此行的code按钮: -

camera.takePicture(mShutterCallback,mPictureCallbackRaw,mPictureCallbackJpeg);

现在我不知道会发生什么,但应用程序卡住我必须强制关闭它,然后我甚至不能访问本机摄像头的应用程序。 我认为它使应用程序不释放Camera对象。 加上形象永远不会被保存。

code: -

SurfaceHolder持有人; SurfaceView表面; 摄像头摄像头; 布尔值是previewRunning,fromOnResume; // preVIEW米preVIEW; / **第一次创建活动时调用。 * / @覆盖 公共无效的onCreate(包savedInstanceState){     super.onCreate(savedInstanceState);     的setContentView(R.layout.main);     为previewRunning = FALSE;     fromOnResume = FALSE;    // requestWindowFeature(Window.FEATURE_NO_TITLE);     表面=(SurfaceView)findViewById(R.id.surface);     支架= surface.getHolder();   holder.addCallback(本);   holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);   按钮BTN =(按钮)findViewById(R.id.click);     btn.setOnClickListener(新OnClickListener(){         @覆盖         公共无效的onClick(视图v){             // TODO自动生成方法存根             camera.takePicture(mShutterCallback,mPictureCallbackRaw,mPictureCallbackJpeg);             //的onCreate(空);         }     }); } @覆盖 公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,         INT高度){ / *如果(是previewRunning){           camera.stop preVIEW();          } * /     Camera.Parameters参数= camera.getParameters();     名单<大小>大小= parameters.getSupported previewSizes();     尺寸尺寸= sizes.get(0);     parameters.set previewSize(size.width,size.height);     camera.setParameters(参数);      camera.start preVIEW();      为previewRunning = TRUE; } @覆盖 公共无效surfaceCreated(SurfaceHolder持有者){     // TODO自动生成方法存根      相机= Camera.open();      尝试 {         camera.set previewDisplay(保持器);     }赶上(IOException异常E){         // TODO自动生成的catch块         e.printStackTrace();     } } @覆盖 公共无效surfaceDestroyed(SurfaceHolder持有者){     // TODO自动生成方法存根     camera.stop preVIEW();     camera.release();     摄像头= NULL; }  Camera.PictureCallback mPictureCallbackRaw =新Camera.PictureCallback(){  公共无效onPictureTaken(byte []的数据,摄像机C){   Log.e(的getClass()getSimpleName(),PICTURE回调RAW:+数据);   camera.start preVIEW();  }  };  Camera.PictureCallback mPictureCallbackJpeg =新Camera.PictureCallback(){  公共无效onPictureTaken(byte []的数据,摄像机C){   Log.e(的getClass()getSimpleName(),PICTURE CALLBACK JPEG:data.length =+数据);   camera.start preVIEW();  }  };  Camera.ShutterCallback mShutterCallback =新Camera.ShutterCallback(){  公共无效onShutter(){  Log.e(的getClass()getSimpleName(),快门回调。);  }  }; / *  *保护无效onRestoreInstanceState(包savedInstanceState)  {  super.onRestoreInstanceState(savedInstanceState);  }  保护无效onResume()  {  Log.e(的getClass()getSimpleName(),onResume。);  camera.open();  fromOnResume = TRUE;  super.onResume();  }  保护无效的onSaveInstanceState(包outState)  {  super.onSaveInstanceState(outState);  }  @覆盖 保护无效的onPause(){     // TODO自动生成方法存根      camera.release();     super.onPause(); }  保护无效的onStop()  {  Log.e(的getClass()getSimpleName(),的onStop。);  super.onStop();  } * /

解决方案

我知道这是不完全的回答你的问题,但wouldn'nt它更容易使用股票摄像头应用程序?您可以使用此code。在您的活动访问:

@覆盖 公共无效的onCreate(包savedInstanceState) {     super.onCreate(savedInstanceState);     的setContentView(R.layout.capture);     按钮捕捉=(按钮)findViewById(R.id.capture_button);     capture.setOnClickListener(新View.OnClickListener(){         @覆盖         公共无效的onClick(视图v){             //我们用股票相机应用程序来拍摄照片             意向意图=新的意图(MediaStore.ACTION_IM​​AGE_CAPTURE);             intent.putExtra(MediaStore.EXTRA_OUTPUT,getImageUri());             startActivityForResult(意向,TAKE_PHOTO_ code);         }     }); } @覆盖 保护无效onActivityResult(INT申请code,INT结果code,意图数据){     super.onActivityResult(要求code,因此code,数据);     如果(要求code == TAKE_PHOTO_ code和;&安培;结果code == RESULT_OK){         开放的我们的ImagePath = getImageUri();         做一点事();     } } / **  *获取捕获的文件的URI  返回:一个Uri哪一条路径是一个映像文件的路径,存储在DCIM文件夹  * / 私人乌里getImageUri(){     在DCIM //店面形象     档案文件=新的文件(Environment.getExternalStorageDirectory()+/ DCIM,CAPTURE_TITLE);     乌里imgUri = Uri.fromFile(文件);     返回imgUri; }

hey guys i am using the following code to access camera from my application. The application is able to access the camera i have also added a button whose onclicklistener adds this line of code :-

camera.takePicture(mShutterCallback, mPictureCallbackRaw, mPictureCallbackJpeg);

Now i dont know what happens but the application gets stuck i have to force close it and then i can not even access the native camera application. I think it leaves the application without releasing the Camera object. Plus the image never gets saved.

Code :-

SurfaceHolder holder; SurfaceView surface; Camera camera; Boolean isPreviewRunning, fromOnResume; //Preview mpreview; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); isPreviewRunning = false; fromOnResume = false; // requestWindowFeature(Window.FEATURE_NO_TITLE); surface = (SurfaceView)findViewById(R.id.surface); holder = surface.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); Button btn = (Button)findViewById(R.id.click); btn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub camera.takePicture(mShutterCallback, mPictureCallbackRaw, mPictureCallbackJpeg); //onCreate(null); } }); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { /* if (isPreviewRunning) { camera.stopPreview(); } */ Camera.Parameters parameters = camera.getParameters(); List<Size> sizes = parameters.getSupportedPreviewSizes(); Size size = sizes.get(0); parameters.setPreviewSize(size.width, size.height); camera.setParameters(parameters); camera.startPreview(); isPreviewRunning=true; } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub camera = Camera.open(); try { camera.setPreviewDisplay(holder); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub camera.stopPreview(); camera.release(); camera=null; } Camera.PictureCallback mPictureCallbackRaw = new Camera.PictureCallback() { public void onPictureTaken(byte[] data, Camera c) { Log.e(getClass().getSimpleName(), "PICTURE CALLBACK RAW: " + data); camera.startPreview(); } }; Camera.PictureCallback mPictureCallbackJpeg= new Camera.PictureCallback() { public void onPictureTaken(byte[] data, Camera c) { Log.e(getClass().getSimpleName(), "PICTURE CALLBACK JPEG: data.length = " + data); camera.startPreview(); } }; Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback() { public void onShutter() { Log.e(getClass().getSimpleName(), "SHUTTER CALLBACK"); } }; /* * protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } protected void onResume() { Log.e(getClass().getSimpleName(), "onResume"); camera.open(); fromOnResume=true; super.onResume(); } protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } @Override protected void onPause() { // TODO Auto-generated method stub camera.release(); super.onPause(); } protected void onStop() { Log.e(getClass().getSimpleName(), "onStop"); super.onStop(); }*/

解决方案

I know this isn't exactly an answer to your question, but wouldn'nt it be easier to use the stock camera application? You can access it using this code in your activity:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.capture); Button capture = (Button) findViewById(R.id.capture_button); capture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // We use the stock camera app to take a photo Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri()); startActivityForResult(intent, TAKE_PHOTO_CODE); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) { Uri imagePath = getImageUri(); doSomething(); } } /** * Get the uri of the captured file * @return A Uri which path is the path of an image file, stored on the dcim folder */ private Uri getImageUri() { // Store image in dcim File file = new File(Environment.getExternalStorageDirectory() + "/DCIM", CAPTURE_TITLE); Uri imgUri = Uri.fromFile(file); return imgUri; }

更多推荐

如何捕捉图像,并将其保存在SD卡

本文发布于:2023-10-11 23:27:43,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1483140.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:图像   并将其   SD

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!