view - Android - I need a generic method to automatically take a screenshot and save to the SD card -
update added following code:
v1.setdrawingcacheenabled(true); v1.measure(measurespec.makemeasurespec(0, measurespec.unspecified), measurespec.makemeasurespec(0, measurespec.unspecified)); v1.layout(0, 0, v1.getmeasuredwidth(), v1.getmeasuredheight()); v1.builddrawingcache(true);
now i'm getting screenshots, they're not need. instance, 1 screen need capture consists of linearlayout containing imageview , listview. when activity loads during app execution, list shows 10 items. capture i'm getting shows top imageview , 1.5 of listitems. there can capture screen shows? (i post shots i'm getting, due ip issues i'd have redact everything, , posting filled black rectangle not super useful)
/update
i'm targeting android 2.2 , trying develop class called activity capture current screen , store image on sd card (preferably png). i've found similar questions there important difference here: can't create new view, , can't build code every activity (i can away adding 1 function call in each activity).
need 1) obtain current activity's view (which i'm doing ((viewgroup)findviewbyid(android.r.id.content)).getchildat(0)) , 2) passing view function in class (defined below). i've tried combining this , this bitmap null after .getdrawingcache() call .compress bombs.
here's code:
public static void capturescreen(view v1){ view v1= v; v1.setdrawingcacheenabled(true); bitmap bm = v1.getdrawingcache(); bytearrayoutputstream bytes = new bytearrayoutputstream(); try { bm.compress(bitmap.compressformat.png, 100, bytes); } catch (exception e1) { log.e("bm.compress", e1.getmessage()); } //create new file name "test.jpg" in sdcard folder. file f = new file(environment.getexternalstoragedirectory() + file.separator + context.getpackagename().replace(".", file.separator) + file.separator + "screenshots" + file.separator + "test.jpg"); //log.d("cf", context.getpackagename()); try { f.createnewfile(); } catch (ioexception e) { e.printstacktrace(); } //write bytes in file try { fileoutputstream fo = new fileoutputstream(f); fo.write(bytes.tobytearray()); } catch (filenotfoundexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } }
logcat:
06-06 16:37:14.613: d/androidruntime(284): shutting down vm 06-06 16:37:14.613: w/dalvikvm(284): threadid=1: thread exiting uncaught exception (group=0x4001d800) 06-06 16:37:14.768: e/androidruntime(284): fatal exception: main 06-06 16:37:14.768: e/androidruntime(284): java.lang.runtimeexception: unable start activity componentinfo{pkgname.pkgnameexpo/pkgname.pkgnameexpo.splashactivity}: java.lang.nullpointerexception: println needs message 06-06 16:37:14.768: e/androidruntime(284): @ android.app.activitythread.performlaunchactivity(activitythread.java:2663) 06-06 16:37:14.768: e/androidruntime(284): @ android.app.activitythread.handlelaunchactivity(activitythread.java:2679) 06-06 16:37:14.768: e/androidruntime(284): @ android.app.activitythread.access$2300(activitythread.java:125) 06-06 16:37:14.768: e/androidruntime(284): @ android.app.activitythread$h.handlemessage(activitythread.java:2033) 06-06 16:37:14.768: e/androidruntime(284): @ android.os.handler.dispatchmessage(handler.java:99) 06-06 16:37:14.768: e/androidruntime(284): @ android.os.looper.loop(looper.java:123) 06-06 16:37:14.768: e/androidruntime(284): @ android.app.activitythread.main(activitythread.java:4627) 06-06 16:37:14.768: e/androidruntime(284): @ java.lang.reflect.method.invokenative(native method) 06-06 16:37:14.768: e/androidruntime(284): @ java.lang.reflect.method.invoke(method.java:521) 06-06 16:37:14.768: e/androidruntime(284): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:868) 06-06 16:37:14.768: e/androidruntime(284): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:626) 06-06 16:37:14.768: e/androidruntime(284): @ dalvik.system.nativestart.main(native method) 06-06 16:37:14.768: e/androidruntime(284): caused by: java.lang.nullpointerexception: println needs message 06-06 16:37:14.768: e/androidruntime(284): @ android.util.log.println_native(native method) 06-06 16:37:14.768: e/androidruntime(284): @ android.util.log.e(log.java:215) 06-06 16:37:14.768: e/androidruntime(284): @ pkgname.pkgnameexpo.classes.cfunctions.capturescreen(cfunctions.java:432) 06-06 16:37:14.768: e/androidruntime(284): @ pkgname.pkgnameexpo.splashactivity.oncreate(splashactivity.java:38) 06-06 16:37:14.768: e/androidruntime(284): @ android.app.instrumentation.callactivityoncreate(instrumentation.java:1047) 06-06 16:37:14.768: e/androidruntime(284): @ android.app.activitythread.performlaunchactivity(activitythread.java:2627) 06-06 16:37:14.768: e/androidruntime(284): ... 11 more
all can tell debug that, before bm.compress called, bm null while v1 not. ideas?
update here's new logcat, think telling me can't create file?
06-06 22:13:55.975: i/system.out(12244): debugger has settled (1400) 06-06 22:13:58.351: e/bm.compress(12244): nullfixnull 06-06 22:13:58.411: w/system.err(12244): java.io.ioexception: no such file or directory 06-06 22:13:58.421: w/system.err(12244): @ java.io.file.createnewfileimpl(native method) 06-06 22:13:58.432: w/system.err(12244): @ java.io.file.createnewfile(file.java:1160) 06-06 22:13:58.432: w/system.err(12244): @ pkgname.pkgnameexpo.classes.cfunctions.capturescreen(cfunctions.java:441) 06-06 22:13:58.441: w/system.err(12244): @ pkgname.pkgnameexpo.splashactivity.oncreate(splashactivity.java:38) 06-06 22:13:58.451: w/system.err(12244): @ android.app.instrumentation.callactivityoncreate(instrumentation.java:1047) 06-06 22:13:58.451: w/system.err(12244): @ android.app.activitythread.performlaunchactivity(activitythread.java:2627) 06-06 22:13:58.461: w/system.err(12244): @ android.app.activitythread.handlelaunchactivity(activitythread.java:2679) 06-06 22:13:58.461: w/system.err(12244): @ android.app.activitythread.access$2300(activitythread.java:125) 06-06 22:13:58.471: w/system.err(12244): @ android.app.activitythread$h.handlemessage(activitythread.java:2033) 06-06 22:13:58.471: w/system.err(12244): @ android.os.handler.dispatchmessage(handler.java:99) 06-06 22:13:58.491: w/system.err(12244): @ android.os.looper.loop(looper.java:123) 06-06 22:13:58.491: w/system.err(12244): @ android.app.activitythread.main(activitythread.java:4627) 06-06 22:13:58.501: w/system.err(12244): @ java.lang.reflect.method.invokenative(native method) 06-06 22:13:58.511: w/system.err(12244): @ java.lang.reflect.method.invoke(method.java:521) 06-06 22:13:58.511: w/system.err(12244): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:868) 06-06 22:13:58.522: w/system.err(12244): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:626) 06-06 22:13:58.522: w/system.err(12244): @ dalvik.system.nativestart.main(native method) 06-06 22:13:58.531: w/system.err(12244): java.io.filenotfoundexception: /mnt/sdcard/pkgname/pkgnameexpo/screenshots/test.jpg (no such file or directory) 06-06 22:13:58.541: w/system.err(12244): @ org.apache.harmony.luni.platform.osfilesystem.openimpl(native method) 06-06 22:13:58.551: w/system.err(12244): @ org.apache.harmony.luni.platform.osfilesystem.open(osfilesystem.java:152) 06-06 22:13:58.551: w/system.err(12244): @ java.io.fileoutputstream.<init>(fileoutputstream.java:97) 06-06 22:13:58.561: w/system.err(12244): @ java.io.fileoutputstream.<init>(fileoutputstream.java:69) 06-06 22:13:58.561: w/system.err(12244): @ pkgname.pkgnameexpo.classes.cfunctions.capturescreen(cfunctions.java:447) 06-06 22:13:58.571: w/system.err(12244): @ pkgname.pkgnameexpo.splashactivity.oncreate(splashactivity.java:38) 06-06 22:13:58.571: w/system.err(12244): @ android.app.instrumentation.callactivityoncreate(instrumentation.java:1047) 06-06 22:13:58.581: w/system.err(12244): @ android.app.activitythread.performlaunchactivity(activitythread.java:2627) 06-06 22:13:58.581: w/system.err(12244): @ android.app.activitythread.handlelaunchactivity(activitythread.java:2679) 06-06 22:13:58.591: w/system.err(12244): @ android.app.activitythread.access$2300(activitythread.java:125) 06-06 22:13:58.591: w/system.err(12244): @ android.app.activitythread$h.handlemessage(activitythread.java:2033) 06-06 22:13:58.601: w/system.err(12244): @ android.os.handler.dispatchmessage(handler.java:99) 06-06 22:13:58.601: w/system.err(12244): @ android.os.looper.loop(looper.java:123) 06-06 22:13:58.612: w/system.err(12244): @ android.app.activitythread.main(activitythread.java:4627) 06-06 22:13:58.612: w/system.err(12244): @ java.lang.reflect.method.invokenative(native method) 06-06 22:13:58.621: w/system.err(12244): @ java.lang.reflect.method.invoke(method.java:521) 06-06 22:13:58.631: w/system.err(12244): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:868) 06-06 22:13:58.631: w/system.err(12244): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:626) 06-06 22:13:58.641: w/system.err(12244): @ dalvik.system.nativestart.main(native method)
you seem constructing rather deep pathname file. if of directories no not exist, need call mkdirs() on file object representing directory want write file.
Comments
Post a Comment