android - How to turn on flash on camera2 api correctly? -
i use standard google sample canera2api
and here try tenr on control_ae_mode_on_always_flash
how doing it, changed line
private void capturestillpicture() { try { final activity activity = getactivity(); if (null == activity || null == mcameradevice) { return; } // capturerequest.builder use take picture. final capturerequest.builder capturebuilder = mcameradevice.createcapturerequest(cameradevice.template_still_capture); capturebuilder.addtarget(mimagereader.getsurface()); // use same ae , af modes preview. capturebuilder.set(capturerequest.control_af_mode, capturerequest.control_af_mode_continuous_picture); ---->>>> ---- // setautoflash(capturebuilder); ---->>>> ++++ capturebuilder.set(capturerequest.control_ae_mode, camerametadata.control_ae_mode_on_always_flash); // orientation int rotation = activity.getwindowmanager().getdefaultdisplay().getrotation(); capturebuilder.set(capturerequest.jpeg_orientation, getorientation(rotation)); cameracapturesession.capturecallback capturecallback = new cameracapturesession.capturecallback() { @override public void oncapturecompleted(@nonnull cameracapturesession session, @nonnull capturerequest request, @nonnull totalcaptureresult result) { showtoast("saved: " + mfile); log.d(tag, mfile.tostring()); unlockfocus(); } }; mcapturesession.stoprepeating(); mcapturesession.capture(capturebuilder.build(), capturecallback, null); } catch (cameraaccessexception e) { e.printstacktrace(); } }
then here
private void unlockfocus() { try { // reset auto-focus trigger mpreviewrequestbuilder.set(capturerequest.control_af_trigger, camerametadata.control_af_trigger_cancel); ---->>>> ---- // setautoflash(mpreviewrequestbuilder); ---->>>> ++++ mpreviewrequestbuilder.set(capturerequest.control_ae_mode, camerametadata.control_ae_mode_on_always_flash); mcapturesession.capture(mpreviewrequestbuilder.build(), mcapturecallback, mbackgroundhandler); // after this, camera go normal state of preview. mstate = state_preview; mcapturesession.setrepeatingrequest(mpreviewrequest, mcapturecallback, mbackgroundhandler); } catch (cameraaccessexception e) { e.printstacktrace(); } }
and here
mcameradevice.createcapturesession(arrays.aslist(surface, mimagereader.getsurface()), new cameracapturesession.statecallback() { @override public void onconfigured(@nonnull cameracapturesession cameracapturesession) { // camera closed if (null == mcameradevice) { return; } // when session ready, start displaying preview. mcapturesession = cameracapturesession; try { // auto focus should continuous camera preview. mpreviewrequestbuilder.set(capturerequest.control_af_mode, capturerequest.control_af_mode_continuous_picture); // flash automatically enabled when necessary. ---->>>> ---- // setautoflash(mpreviewrequestbuilder); ---->>>> ++++ mpreviewrequestbuilder.set(capturerequest.control_ae_mode, camerametadata.control_ae_mode_on_always_flash); // finally, start displaying camera preview. mpreviewrequest = mpreviewrequestbuilder.build(); mcapturesession.setrepeatingrequest(mpreviewrequest, mcapturecallback, mbackgroundhandler); } catch (cameraaccessexception e) { e.printstacktrace(); } } @override public void onconfigurefailed( @nonnull cameracapturesession cameracapturesession) { showtoast("failed"); } }, null );
and if launch app such configuration work , flash bern everytime, if lauch app on samsung s6
got stack on preview after flash berned.
it weird why device work , issue...
but have tried fix figered out next if chenge 1 parametr in capturestillpicture()
method here
private void capturestillpicture() { try { final activity activity = getactivity(); if (null == activity || null == mcameradevice) { return; } // capturerequest.builder use take picture. final capturerequest.builder capturebuilder = mcameradevice.createcapturerequest(cameradevice.template_still_capture); capturebuilder.addtarget(mimagereader.getsurface()); // use same ae , af modes preview. capturebuilder.set(capturerequest.control_af_mode, capturerequest.control_af_mode_continuous_picture); ---->>>> ---- // setautoflash(capturebuilder); ---->>>> ---- // capturebuilder.set(capturerequest.control_ae_mode, camerametadata.control_ae_mode_on_always_flash); ---->>>> ++++ capturebuilder.set(capturerequest.control_ae_mode, camerametadata.control_ae_mode_on_auto_flash); // orientation int rotation = activity.getwindowmanager().getdefaultdisplay().getrotation(); capturebuilder.set(capturerequest.jpeg_orientation, getorientation(rotation)); cameracapturesession.capturecallback capturecallback = new cameracapturesession.capturecallback() { @override public void oncapturecompleted(@nonnull cameracapturesession session, @nonnull capturerequest request, @nonnull totalcaptureresult result) { showtoast("saved: " + mfile); log.d(tag, mfile.tostring()); unlockfocus(); } }; mcapturesession.stoprepeating(); mcapturesession.capture(capturebuilder.build(), capturecallback, null); } catch (cameraaccessexception e) { e.printstacktrace(); } }
i have changed control_ae_mode_on_always_flash
control_ae_mode_on_auto_flash
, configuration works on samsung s6
perfectly, stop working device...
finally have 2 different configuration if apply 1 devices support , works perfectly, devices don't... , vise versa...
what doing wrong?
Comments
Post a Comment