i have custom camera activity in app, working fine, when press home button while in camera activity, , return app, crashes, , logcat says there null pointer exception @ surface view creation. setup method called on onresume:
public void setup() { preview = new camerapreview(this); ((framelayout) findviewbyid(r.id.camera_preview)).addview(preview); head=(imageview)findviewbyid(r.id.head); head.setx((float)(shared.screenwidth/5*1.8)); head.sety((float)(shared.screenheight*0.03)); layoutparams params = (layoutparams) head.getlayoutparams(); params.width = (int)((shared.screenwidth/5*3.2)-(head.getx())); params.height=(int)((shared.screenheight/3.8)-(head.gety())); head.setlayoutparams(params); body=(imageview)findviewbyid(r.id.body); body.setx((float)(shared.screenwidth/7)); body.sety((float)(shared.screenheight/3.8)); layoutparams params2 = (layoutparams) body.getlayoutparams(); params2.width = (int)((shared.screenwidth/7*6)-(body.getx())); params2.height=(int)((shared.screenheight)-(body.gety())); body.setlayoutparams(params2); go=(button)findviewbyid(r.id.go); again=(button)findviewbyid(r.id.again); stop=(imagebutton)findviewbyid(r.id.stop); stop.setonclicklistener( new onclicklistener() { public void onclick(view v) { intent =new intent(camactivity.this,main.class); i.addflags(intent.flag_activity_clear_top); startactivity(i); } }); btn = (imagebutton) findviewbyid(r.id.takepic); btn.setonclicklistener( new onclicklistener() { public void onclick(view v) { preview.camera.takepicture(shuttercallback, rawcallback, jpegcallback); btn.setvisibility(view.invisible); btn.setenabled(false); go.setvisibility(view.visible); go.setenabled(true); head.setvisibility(view.invisible); body.setvisibility(view.invisible); go.setonclicklistener( new onclicklistener() { public void onclick(view v) { shared.bm=bitmap.createscaledbitmap(bmp, shared.screenwidth, shared.screenheight, true); intent i=new intent(camactivity.this,ikill.class); i.addflags(intent.flag_activity_clear_top); startactivity(i); } }); again.setvisibility(view.visible); again.setenabled(true); again.setonclicklistener( new onclicklistener() { public void onclick(view v) { if (build.version.sdk_int >= 11) { recreate(); } else { intent intent = getintent(); overridependingtransition(0, 0); intent.addflags(intent.flag_activity_no_animation); finish(); overridependingtransition(0, 0); startactivity(intent); } } }); } }); }
in addition, on oncreate method have this:
requestwindowfeature(window.feature_no_title); // hide status bar final window win = getwindow(); win.setflags(windowmanager.layoutparams.flag_fullscreen, windowmanager.layoutparams.flag_fullscreen); setcontentview(r.layout.activity_camera);
and logcat:
08-23 08:56:20.174: e/androidruntime(835): fatal exception: main 08-23 08:56:20.174: e/androidruntime(835): java.lang.nullpointerexception 08-23 08:56:20.174: e/androidruntime(835): @ com.example.i_kill.camerapreview.surfacecreated(camerapreview.java:38) 08-23 08:56:20.174: e/androidruntime(835): @ android.view.surfaceview.updatewindow(surfaceview.java:569) 08-23 08:56:20.174: e/androidruntime(835): @ android.view.surfaceview.access$000(surfaceview.java:86) 08-23 08:56:20.174: e/androidruntime(835): @ android.view.surfaceview$3.onpredraw(surfaceview.java:174) 08-23 08:56:20.174: e/androidruntime(835): @ android.view.viewtreeobserver.dispatchonpredraw(viewtreeobserver.java:680) 08-23 08:56:20.174: e/androidruntime(835): @ android.view.viewrootimpl.performtraversals(viewrootimpl.java:1842) 08-23 08:56:20.174: e/androidruntime(835): @ android.view.viewrootimpl.dotraversal(viewrootimpl.java:989) 08-23 08:56:20.174: e/androidruntime(835): @ android.view.viewrootimpl$traversalrunnable.run(viewrootimpl.java:4351) 08-23 08:56:20.174: e/androidruntime(835): @ android.view.choreographer$callbackrecord.run(choreographer.java:749) 08-23 08:56:20.174: e/androidruntime(835): @ android.view.choreographer.docallbacks(choreographer.java:562) 08-23 08:56:20.174: e/androidruntime(835): @ android.view.choreographer.doframe(choreographer.java:532) 08-23 08:56:20.174: e/androidruntime(835): @ android.view.choreographer$framedisplayeventreceiver.run(choreographer.java:735) 08-23 08:56:20.174: e/androidruntime(835): @ android.os.handler.handlecallback(handler.java:725) 08-23 08:56:20.174: e/androidruntime(835): @ android.os.handler.dispatchmessage(handler.java:92) 08-23 08:56:20.174: e/androidruntime(835): @ android.os.looper.loop(looper.java:137) 08-23 08:56:20.174: e/androidruntime(835): @ android.app.activitythread.main(activitythread.java:5041) 08-23 08:56:20.174: e/androidruntime(835): @ java.lang.reflect.method.invokenative(native method) 08-23 08:56:20.174: e/androidruntime(835): @ java.lang.reflect.method.invoke(method.java:511) 08-23 08:56:20.174: e/androidruntime(835): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:793) 08-23 08:56:20.174: e/androidruntime(835): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:560) 08-23 08:56:20.174: e/androidruntime(835): @ dalvik.system.nativestart.main(native method) 08-23 08:56:26.065: e/trace(909): error opening trace file: no such file or directory
and here's entire class: package com.example.i_kill;
import android.app.activity; import android.content.intent; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.hardware.camera; import android.hardware.camera.picturecallback; import android.hardware.camera.shuttercallback; import android.os.build; import android.os.bundle; import android.util.log; import android.view.view; import android.view.view.onclicklistener; import android.view.viewgroup.layoutparams; import android.view.window; import android.view.windowmanager; import android.widget.button; import android.widget.framelayout; import android.widget.imagebutton; import android.widget.imageview; public class camactivity extends activity { public static final int media_type_image = 1; public static string tag="mainactivity"; private static camera camera; private camerapreview preview; private imageview head,body; private imagebutton btn, stop; private button again,go; private bitmap bmp; public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); requestwindowfeature(window.feature_no_title); // hide status bar final window win = getwindow(); win.setflags(windowmanager.layoutparams.flag_fullscreen, windowmanager.layoutparams.flag_fullscreen); setcontentview(r.layout.activity_camera); } public void setup() { preview = new camerapreview(this); ((framelayout) findviewbyid(r.id.camera_preview)).addview(preview); head=(imageview)findviewbyid(r.id.head); head.setx((float)(shared.screenwidth/5*1.8)); head.sety((float)(shared.screenheight*0.03)); layoutparams params = (layoutparams) head.getlayoutparams(); params.width = (int)((shared.screenwidth/5*3.2)-(head.getx())); params.height=(int)((shared.screenheight/3.8)-(head.gety())); head.setlayoutparams(params); body=(imageview)findviewbyid(r.id.body); body.setx((float)(shared.screenwidth/7)); body.sety((float)(shared.screenheight/3.8)); layoutparams params2 = (layoutparams) body.getlayoutparams(); params2.width = (int)((shared.screenwidth/7*6)-(body.getx())); params2.height=(int)((shared.screenheight)-(body.gety())); body.setlayoutparams(params2); go=(button)findviewbyid(r.id.go); again=(button)findviewbyid(r.id.again); stop=(imagebutton)findviewbyid(r.id.stop); stop.setonclicklistener( new onclicklistener() { public void onclick(view v) { intent =new intent(camactivity.this,main.class); i.addflags(intent.flag_activity_clear_top); startactivity(i); } }); btn = (imagebutton) findviewbyid(r.id.takepic); btn.setonclicklistener( new onclicklistener() { public void onclick(view v) { preview.camera.takepicture(shuttercallback, rawcallback, jpegcallback); btn.setvisibility(view.invisible); btn.setenabled(false); go.setvisibility(view.visible); go.setenabled(true); head.setvisibility(view.invisible); body.setvisibility(view.invisible); go.setonclicklistener( new onclicklistener() { public void onclick(view v) { shared.bm=bitmap.createscaledbitmap(bmp, shared.screenwidth, shared.screenheight, true); intent i=new intent(camactivity.this,ikill.class); i.addflags(intent.flag_activity_clear_top); startactivity(i); } }); again.setvisibility(view.visible); again.setenabled(true); again.setonclicklistener( new onclicklistener() { public void onclick(view v) { if (build.version.sdk_int >= 11) { recreate(); } else { intent intent = getintent(); overridependingtransition(0, 0); intent.addflags(intent.flag_activity_no_animation); finish(); overridependingtransition(0, 0); startactivity(intent); } } }); } }); } shuttercallback shuttercallback = new shuttercallback() { public void onshutter() { log.d(tag, "onshutter'd"); } }; picturecallback rawcallback = new picturecallback() { public void onpicturetaken(byte[] data, camera camera) { log.d(tag, "onpicturetaken - raw"); } }; /** handles data jpeg picture */ picturecallback jpegcallback = new picturecallback() { public void onpicturetaken(byte[] data, camera camera) { bmp=bitmapfactory.decodebytearray(data, 0, data.length ); system.out.println(bmp.getheight()); system.out.println(bmp.getwidth()); }; }; public void onpause(){ super.onpause(); if(camera!=null){ camera.stoppreview(); camera.setpreviewcallback(null); camera.release(); camera = null; } } public void onresume() { super.onresume(); setup(); } }
and camera preview class:
package com.example.i_kill; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.util.list; import android.content.context; import android.graphics.canvas; import android.graphics.color; import android.graphics.paint; import android.hardware.camera; import android.hardware.camera.previewcallback; import android.hardware.camera.size; import android.util.log; import android.view.surfaceholder; import android.view.surfaceview; public class camerapreview extends surfaceview implements surfaceholder.callback { private surfaceholder holder; public camera camera; public static string tag="camerapreview"; public camerapreview(context context) { super(context); holder=getholder(); holder.addcallback(this); holder.settype(surfaceholder.surface_type_push_buffers); } public void surfacecreated(surfaceholder holder) { // surface has been created, tell camera draw preview. camera = getcamerainstance(); try { camera.setpreviewdisplay(holder); camera.setpreviewcallback(new previewcallback() { public void onpreviewframe(byte[] data, camera arg1) { fileoutputstream outstream = null; try { outstream = new fileoutputstream(string.format("/sdcard/%d.jpg", system.currenttimemillis())); outstream.write(data); outstream.close(); log.d(tag, "onpreviewframe - wrote bytes: " + data.length); } catch (filenotfoundexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } { } camerapreview.this.invalidate(); } }); } catch (ioexception e) { e.printstacktrace(); } } public void surfacedestroyed(surfaceholder holder) { if(camera!=null){ camera.stoppreview(); camera.setpreviewcallback(null); camera.release(); camera = null; } } public void surfacechanged(surfaceholder holder, int format, int w, int h) { camera.parameters parameters = camera.getparameters(); list<size> previewsizes = parameters.getsupportedpreviewsizes(); size bestsize = null; int bestdiff = 0; int diff = 0; (size size : previewsizes) { diff = math.abs(h - size.height) + math.abs(w - size.width); if (bestsize == null || diff < bestdiff) { bestsize = size; bestdiff = diff; } parameters.setpreviewsize(bestsize.width, bestsize.height); camera.setparameters(parameters); } //start preview of camera camera.startpreview(); } @override public void draw(canvas canvas) { super.draw(canvas); paint p= new paint(color.red); log.d(tag,"draw"); canvas.drawtext("preview", canvas.getwidth()/2, canvas.getheight()/2, p ); } private camera getcamerainstance(){ camera c = null; try { c = camera.open(); // attempt camera instance } catch (exception e){ // camera not available (in use or not exist) } return c; // returns null if camera unavailable } }
thanks :)
i solved calling setcontentview
on resume. thank all!