I have created a custom camera application and it works perfectly fine on almost all devices but it seems to be crashing on devices listed as other in the developer portal. These users are all giving me bad reviews I would like to solve this problem but it is very hard for me to figure it out, because it works perfectly on all the devices I own.
camera.setPreviewDisplay(holder);
is what is causing the error and it is occurring when the app launches.`
public class CamPreview extends SurfaceView implements SurfaceHolder.Callback
{
SurfaceHolder holder;
Camera camera;
private List<Camera.Size> sizes;
public CamPreview(Context context, Camera camera)
{
super(context);
this.camera = camera;
holder = this.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holder.addCallback(this);
}
private Camera.Size getBestPreviewSize(int width, int height)
{
Camera.Size result=null;
Camera.Parameters p = camera.getParameters();
for (Camera.Size size : p.getSupportedPreviewSizes()) {
if (size.width<=width && size.height<=height) {
if (result==null) {
result=size;
} else {
int resultArea=result.width*result.height;
int newArea=size.width*size.height;
if (newArea>resultArea) {
result=size;
}
}
}
}
return result;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
if (holder.getSurface() == null) return;
Camera.Parameters parameters = camera.getParameters();
sizes = parameters.getSupportedPreviewSizes();
Camera.Size optimalSize = getBestPreviewSize(width, height);
try{
parameters.setPreviewSize(optimalSize.width,optimalSize.height);
camera.setParameters(parameters);
}
catch (NullPointerException a)
{
}
camera.startPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
try
{
camera.setPreviewDisplay(holder);
}
catch (IOException e)
{
camera.release();
camera=null;
Log.d("FrontCam", "Error creating surface: " + e.getMessage());
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
if (camera != null) {
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
}
}
}
logcat:
java.lang.NullPointerException
at com.me.frontcam.CamPreview.surfaceCreated(CamPreview.java:136)
at android.view.SurfaceView.updateWindow(SurfaceView.java:552)
at android.view.SurfaceView.dispatchDraw(SurfaceView.java:350)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1921)
at android.view.ViewRoot.draw(ViewRoot.java:1528)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1264)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1866)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)
how I open the camera
void initCamera()
{
//check for front camera
if(Camera.getNumberOfCameras()>1)
{
camera= Camera.open(1);
try
{
camera.cancelAutoFocus();
}
catch (RuntimeException a)
{
}
try{
camera.setDisplayOrientation(90);
}
catch (NullPointerException a)
{
camera.setDisplayOrientation(90);
}
}
else
{
new AlertDialog.Builder(this)
.setTitle("Sorry but you cant use this app")
.setMessage("You do not have a front camera")
.setPositiveButton("Quit", new DialogInterface.OnClickListener() {
//Quits application
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.show();
}
}
I then call the initUI method where the CamPreview constructor is called
void initUI()
{
white= new ImageView(this);
imgShoot = (ImageButton) findViewById(R.id.imgShoot);
imgShoot.setOnClickListener(imgShootOnClick);
frmPreview = (FrameLayout) findViewById(R.id.frmPreview);
preview = new CamPreview(this, camera);
frmPreview.addView(white);
white.setImageResource(R.drawable.aperture_opening);
frmPreview.addView(preview);
frmPreview.bringChildToFront(preview);
}
Ive looked at both of these and they did not solve my problem Android - cam.setPreviewDisplay(holder) running into IOError
.setPreviewDisplay(holder) throwing null pointer exception
Any help appreciated greatly!