today had faced issue in android surfaceview camera customization. tried below code.
the issue occurred when captured image, stops camera preview , doesn't return activity.
following code implemented in program. took code existing reference on stackoverflow
supporting class.
public class androidcamerasurfaceview extends activity implements surfaceholder.callback { textview testview; camera camera; surfaceview surfaceview; surfaceholder surfaceholder; boolean preview; picturecallback rawcallback; shuttercallback shuttercallback; picturecallback jpegcallback; int displayheight, displaywidth; camera.previewcallback previewcallback; /** called when activity first created. */ @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); requestwindowfeature(window.feature_no_title); setcontentview(r.layout.camerasurfaceview); getwindow().addflags(windowmanager.layoutparams.flag_fullscreen); getwindow().addflags(windowmanager.layoutparams.flag_keep_screen_on); surfaceview = (surfaceview) findviewbyid(r.id.surfaceview); surfaceholder = surfaceview.getholder(); surfaceholder.addcallback(this); surfaceholder.settype(surfaceholder.surface_type_push_buffers); jpegcallback = new picturecallback() { public void onpicturetaken(byte[] data, camera camera) { bundle b = new bundle(); b.putbytearray("image", data); intent intent = new intent(); intent.putextras(b); setresult(result_ok, intent); finish(); // refreshcamera(); } }; } public void captureimage(view v) throws ioexception { // take picture camera.takepicture(null, null, jpegcallback); } public void refreshcamera() { if (surfaceholder.getsurface() == null) { // preview surface not exist return; } try { camera.stoppreview(); } catch (exception e) { } try { camera.setdisplayorientation(90); camera.setpreviewdisplay(surfaceholder); camera.startpreview(); } catch (exception e) { } } public void surfacechanged(surfaceholder holder, int format, int width, int height) { if (preview) { camera.stoppreview(); } try{ camera.parameters parameters = camera.getparameters(); list<size> sizes = parameters.getsupportedpreviewsizes(); size optimalsize = getoptimalpreviewsize(sizes, width, height); parameters.setpreviewsize(optimalsize.width, optimalsize.height); camera.setparameters(parameters); try { camera.setdisplayorientation(90); camera.setpreviewdisplay(holder); camera.startpreview(); preview = true; } catch (ioexception e) { e.printstacktrace(); } }catch(exception e){ system.out.println("surface exception---=>"+e); } } public void surfacecreated(surfaceholder holder) { camera = camera.open(); if (camera != null) { camera.parameters params = camera.getparameters(); camera.setdisplayorientation(90); camera.setparameters(params); } } public void surfacedestroyed(surfaceholder holder) { // stop preview , release camera camera.stoppreview(); camera.release(); camera = null; } private size getoptimalpreviewsize(list<size> sizes, int w, int h) { final double aspect_tolerance = 1; double targetratio = (double) w / h; if (sizes == null) return null; size optimalsize = null; double mindiff = double.max_value; int targetheight = h; (size size : sizes) { double ratio = (double) size.width / size.height; if (math.abs(ratio - targetratio) > aspect_tolerance) continue; if (math.abs(size.height - targetheight) < mindiff) { optimalsize = size; mindiff = math.abs(size.height - targetheight); } } if (optimalsize == null) { mindiff = double.max_value; (size size : sizes) { if (math.abs(size.height - targetheight) < mindiff) { optimalsize = size; mindiff = math.abs(size.height - targetheight); } } } return optimalsize; } }2.implemented in activity
public void captureimage() {
intent intentdriver = new intent(addnewdevice_activity.this, androidcamerasurfaceview.class); startactivityforresult(intentdriver, 0); // // intent intent = new intent(mediastore.action_image_capture); // // uri fileuri = getoutputmediafileuri(media_type_image); // // intent.putextra(mediastore.extra_output, fileuri); // // // start image capture intent // startactivityforresult(intent, camera_capture_image_request_code); // intent intent = new intent(mediastore.action_image_capture); // // fileuri = getoutputmediafileuri(media_type_image); // // intent.putextra(mediastore.extra_output, fileuri); // // // start image capture intent // startactivityforresult(intent, camera_capture_image_request_code); } protected void onactivityresult(int requestcode, int resultcode, intent data) { super.onactivityresult(requestcode, resultcode, data); if (requestcode == 0) { system.out.println("result code: " + resultcode); if (resultcode == result_ok && data != null) { bundle bundle = data.getextras(); byte[] test = bundle.getbytearray("image"); bitmap bpcamera = bitmapfactory.decodebytearray(test, 0, test.length); matrix matrix = new matrix(); matrix.postrotate(90); bpcamera = bitmap .createbitmap(bpcamera, 0, 0, bpcamera.getwidth(), bpcamera.getheight(), matrix, true); imageview_camera.setimagebitmap(bpcamera); selectedimagestr = encodetobase64(bpcamera); } } else { finish(); } }
google had revised camera api in api version 21, henceforth have adopt new camera2 package , has adhered in cases camera functionalities comes picture. here link sample code published google uses surface view implementation , works flawless in android 5.0. believe solves bit of mystery.
Comments
Post a Comment