surfaceview for camera is not working in android lollipop os -


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

  1. 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.

https://github.com/googlesamples/android-camera2basic


Comments