Sunday, 15 May 2011

android - ScheduledExecutorService run only once inside Service -



android - ScheduledExecutorService run only once inside Service -

i running scheduledexecutorservice within of service takes image in background. scheduledexecutorservice running 1 time means taking 1 image after interval passed in function. showing no errors @ all. next code of service

package com.anawaz.spy; import java.io.file; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.util.concurrent.executors; import java.util.concurrent.scheduledexecutorservice; import java.util.concurrent.scheduledfuture; import java.util.concurrent.timeunit; import android.app.service; import android.content.intent; import android.hardware.camera; import android.hardware.camera.picturecallback; import android.hardware.camera.shuttercallback; import android.os.ibinder; import android.util.log; public class camservice extends service { private static final string tag = "tag"; private final scheduledexecutorservice scheduler = executors.newscheduledthreadpool(1); photographic camera camera; scheduledfuture beeperhandle; /* service life cycle overrides */ @override public void oncreate() { super.oncreate(); photographic camera = camera.open(); seek { camera.setpreviewdisplay(null); } grab (ioexception e) { e.printstacktrace(); } //takepicsperiodically(mainactivity.getspint(mainactivity.sp_period)); takepicsperiodically(5); } @override public void ondestroy() { stoppics(); super.ondestroy(); } @override public ibinder onbind(intent intent) { // todo auto-generated method stub homecoming null; } // @override // public ibinder onbind(intent arg0) { // homecoming myremoteservicestub; // } // /* ----------------------------------- */ // // private imyremoteservice.stub myremoteservicestub = new // imyremoteservice.stub() { // // /* basic service methods */ // public boolean iscollecting() { // homecoming (beeperhandle != null); // } // /* ------------------------- */ // }; public void takepicsperiodically(long period) { final runnable beeper = new runnable() { public void run() { log.d("tag", "new image taken"); camera.takepicture(shuttercallback, rawcallback, jpegcallback); } }; camera.startpreview(); beeperhandle = scheduler.scheduleatfixedrate(beeper, period, period,timeunit.seconds); } public void stoppics() { beeperhandle.cancel(true); beeperhandle = null; camera.stoppreview(); camera.release(); photographic camera = null; } /* photographic camera phone call backs */ shuttercallback shuttercallback = new shuttercallback() { public void onshutter() { log.d(tag, "onshutter'd"); } }; /** handles info raw image */ picturecallback rawcallback = new picturecallback() { public void onpicturetaken(byte[] data, photographic camera camera) { log.d(tag, "onpicturetaken - raw"); } }; /** handles info j peg image */ picturecallback jpegcallback = new picturecallback() { public void onpicturetaken(byte[] data, photographic camera camera) { fileoutputstream outstream = null; seek { // write local sand box file scheme // outstream = // camerademo.this.openfileoutput(string.format("%d.jpg", // system.currenttimemillis()), 0); // or write s d card file mfolder; mfolder = new file("/sdcard/spy/"); if (!mfolder.exists()) { mfolder.mkdir(); } outstream = new fileoutputstream(string.format( "/sdcard/spy/image_%d.jpg", system.currenttimemillis())); outstream.write(data); outstream.close(); log.d(tag, "onpicturetaken - wrote bytes: " + data.length); } grab (filenotfoundexception e) { e.printstacktrace(); } grab (ioexception e) { e.printstacktrace(); } { } log.d(tag, "onpicturetaken - jpeg"); } }; }

no logcat because not getting error. service running after taking picture. doing wrong?

after reading post http://code.nomad-labs.com/2011/12/09/mother-fk-the-scheduledexecutorservice/ tried try catch block. , found camera.takepicture(shuttercallback, rawcallback, jpegcallback); throwing exception. because of error not starting preview after taking first picture. refer answer. http://stackoverflow.com/a/21728454/1770916

following updated working code of service.

package com.anawaz.spy; import java.io.file; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.util.concurrent.executors; import java.util.concurrent.scheduledexecutorservice; import java.util.concurrent.scheduledfuture; import java.util.concurrent.timeunit; import android.app.service; import android.content.intent; import android.hardware.camera; import android.hardware.camera.picturecallback; import android.hardware.camera.shuttercallback; import android.os.ibinder; import android.util.log; public class camservice extends service { private static final string tag = "tag"; private final scheduledexecutorservice scheduler = executors.newscheduledthreadpool(1); photographic camera camera; scheduledfuture beeperhandle; /* service life cycle overrides */ @override public void oncreate() { super.oncreate(); photographic camera = camera.open(); seek { camera.setpreviewdisplay(null); } grab (ioexception e) { e.printstacktrace(); } file mfolder = new file("/sdcard/spy/"); if (!mfolder.exists()) { mfolder.mkdir(); } takepicsperiodically(mainactivity.getspint(mainactivity.sp_period)); //takepicsperiodically(5); } @override public void ondestroy() { stoppics(); super.ondestroy(); } @override public ibinder onbind(intent intent) { // todo auto-generated method stub homecoming null; } public void takepicsperiodically(long period) { camera.startpreview(); beeperhandle = scheduler.scheduleatfixedrate(beeper,period, period,timeunit.seconds); } final runnable beeper = new runnable() { public void run() { log.d("tag", "new image taken"); seek { camera.startpreview(); camera.takepicture(shuttercallback, rawcallback, jpegcallback); }catch (exception e) { log.e("tag","error in executing: no longer run!: "+e.getmessage()); e.printstacktrace(); } } }; public void stoppics() { beeperhandle.cancel(true); beeperhandle = null; camera.stoppreview(); camera.release(); photographic camera = null; } /* photographic camera phone call backs */ final shuttercallback shuttercallback = new shuttercallback() { public void onshutter() { log.d(tag, "onshutter'd"); } }; /** handles info raw image */ final picturecallback rawcallback = new picturecallback() { public void onpicturetaken(byte[] data, photographic camera camera) { log.d(tag, "onpicturetaken - raw"); } }; /** handles info j peg image */ final picturecallback jpegcallback = new picturecallback() { public void onpicturetaken(byte[] data, photographic camera camera) { fileoutputstream outstream = null; seek { // write local sand box file scheme // outstream = // camerademo.this.openfileoutput(string.format("%d.jpg", // system.currenttimemillis()), 0); // or write s d card outstream = new fileoutputstream(string.format( "/sdcard/spy/image_%d.jpg", system.currenttimemillis())); outstream.write(data); outstream.close(); log.d(tag, "onpicturetaken - wrote bytes: " + data.length); } grab (filenotfoundexception e) { e.printstacktrace(); } grab (ioexception e) { e.printstacktrace(); } { } log.d(tag, "onpicturetaken - jpeg"); } }; }

android android-service scheduledexecutorservice

No comments:

Post a Comment