嘿,大家好我用下面的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_IMAGE_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卡
发布评论