我在我的服务中运行ScheduledExecutorService
,后台拍摄图像。 ScheduledExecutorService
只运行一次意味着在函数传递的间隔后只拍摄一张图片。完全没有错误。以下是我的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);
Camera camera;
ScheduledFuture beeperHandle;
/* Service Life cycle Overrides */
@Override
public void onCreate() {
super.onCreate();
camera = Camera.open();
try {
camera.setPreviewDisplay(null);
} catch (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
return null;
}
// @Override
// public IBinder onBind(Intent arg0) {
// return myRemoteServiceStub;
// }
// /* ----------------------------------- */
//
// private IMyRemoteService.Stub myRemoteServiceStub = new
// IMyRemoteService.Stub() {
//
// /* Basic Service Methods */
// public boolean isCollecting() {
// return (beeperHandle != null);
// }
// /* ------------------------- */
// };
public void takePicsPeriodically(long period) {
final Runnable beeper = new Runnable() {
public void run() {
Log.d("TAG", "New Picture 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();
camera = null;
}
/* Camera Call backs */
ShutterCallback shutterCallback = new ShutterCallback() {
public void onShutter() {
Log.d(TAG, "onShutter'd");
}
};
/** Handles data for raw picture */
PictureCallback rawCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
Log.d(TAG, "onPictureTaken - raw");
}
};
/** Handles data for j peg picture */
PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream outStream = null;
try {
// write to local sand box file system
// outStream =
// CameraDemo.this.openFileOutput(String.format("%d.jpg",
// System.currentTimeMillis()), 0);
// Or write to 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);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
Log.d(TAG, "onPictureTaken - jpeg");
}
};
}
没有Logcat,因为没有收到任何错误。拍照后服务也在运行。我做错了什么?
答案 0 :(得分:11)
阅读此帖http://code.nomad-labs.com/2011/12/09/mother-fk-the-scheduledexecutorservice/后,我尝试了try catch
阻止。并且发现camera.takePicture(shutterCallback, rawCallback, jpegCallback);
正在抛出异常。这是因为我的错误,我拍摄第一张照片后没有开始预览。请参阅此答案。 https://stackoverflow.com/a/21728454/1770916
以下是我服务的更新工作代码。
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);
Camera camera;
ScheduledFuture beeperHandle;
/* Service Life cycle Overrides */
@Override
public void onCreate() {
super.onCreate();
camera = Camera.open();
try {
camera.setPreviewDisplay(null);
} catch (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
return 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 Picture Taken");
try {
camera.startPreview();
camera.takePicture(shutterCallback, rawCallback, jpegCallback);
}catch (Exception e) {
Log.e("TAG","error in executing: It will no longer be run!: "+e.getMessage());
e.printStackTrace();
}
}
};
public void stopPics() {
beeperHandle.cancel(true);
beeperHandle = null;
camera.stopPreview();
camera.release();
camera = null;
}
/* Camera Call backs */
final ShutterCallback shutterCallback = new ShutterCallback() {
public void onShutter() {
Log.d(TAG, "onShutter'd");
}
};
/** Handles data for raw picture */
final PictureCallback rawCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
Log.d(TAG, "onPictureTaken - raw");
}
};
/** Handles data for j peg picture */
final PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream outStream = null;
try {
// write to local sand box file system
// outStream =
// CameraDemo.this.openFileOutput(String.format("%d.jpg",
// System.currentTimeMillis()), 0);
// Or write to 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);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
Log.d(TAG, "onPictureTaken - jpeg");
}
};
}