Android camera preview displays green screen -
i have implemented camera preview on android >= 4.1.2. on android 5 on galaxy s4 (two different devices) view displays 3 camera previews , green screen:

on galaxy s3 (android 4.3), galaxy s2 (android 4.1.2) , galaxy tab s (android 5.0.1) works correctly.
this code below:
import android.content.context; import android.hardware.camera; import android.view.surfaceholder; import android.view.surfaceview; import java.util.list; @suppresswarnings("deprecation") public class cameraview extends surfaceview { private boolean inpreview = false; private boolean surfacecreated = false; private camera camera = null; private camera.size previewsize = null; public cameraview(context context) { super(context); surfaceholder surfaceholder = getholder(); surfaceholder.callback surfaceholdercallback = new surfaceholder.callback() { @override public void surfacecreated(surfaceholder holder) { surfacecreated = true; try { camera = camera.open(); camera.setpreviewdisplay(holder); } catch (exception e) { e.printstacktrace(); camera.release(); camera = null; } } @override public void surfacechanged(surfaceholder holder, int format, int width, int height) { if (holder.getsurface() == null || camera == null) { return; } camera.stoppreview(); list<camera.size> sizes = camera.getparameters().getsupportedpicturesizes(); previewsize = getoptimalpreviewsize(sizes, width, height); startpreview(); } @override public void surfacedestroyed(surfaceholder holder) { surfacecreated = false; if (camera != null) { camera.stoppreview(); camera.release(); camera = null; } } }; surfaceholder.addcallback(surfaceholdercallback); surfaceholder.settype(surfaceholder.surface_type_push_buffers); } public void onresume() { if(!inpreview && camera != null && surfacecreated) { startpreview(); } } public void onpause() { if(camera != null) { camera.stoppreview(); inpreview = false; } } private void startpreview() { camera.parameters parameters = camera.getparameters(); parameters.setpreviewsize(previewsize.width, previewsize.height); camera.setparameters(parameters); camera.startpreview(); inpreview = true; } private camera.size getoptimalpreviewsize(list<camera.size> sizes, int w, int h) { final double aspect_tolerance = 0.05; double targetratio = (double) w / h; if (sizes == null) return null; camera.size optimalsize = null; double mindiff = double.max_value; (camera.size size : sizes) { double ratio = (double) size.width / size.height; if (math.abs(ratio - targetratio) > aspect_tolerance) continue; if (math.abs(size.height - h) < mindiff) { optimalsize = size; mindiff = math.abs(size.height - h); } } if (optimalsize == null) { mindiff = double.max_value; (camera.size size : sizes) { if (math.abs(size.height - h) < mindiff) { optimalsize = size; mindiff = math.abs(size.height - h); } } } return optimalsize; } } usage:
public class mainactivity extends activity { private cameraview cameraview; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); cameraview = new cameraview(this); viewgroup.layoutparams params = new viewgroup.layoutparams(viewgroup.layoutparams.match_parent, viewgroup.layoutparams.match_parent); cameraview.setlayoutparams(params); setcontentview(cameraview); } @override protected void onresume() { super.onresume(); cameraview.onresume(); } @override protected void onpause() { super.onpause(); cameraview.onpause(); } } i support landscape mode.
Comments
Post a Comment