Service 在后台服务中从照相机拍摄图像
我正在创建一个应用程序,它将作为后台服务工作,并将定期从前置摄像头拍摄图像,无需预览,应用程序必须保持后台状态。我在一个论坛上找到了来源。人们说代码是有效的,但对我来说,这代码不起作用。我不能拍照 请帮我修复这个代码。对不起,我的英语()Service 在后台服务中从照相机拍摄图像,service,background,camera,Service,Background,Camera,我正在创建一个应用程序,它将作为后台服务工作,并将定期从前置摄像头拍摄图像,无需预览,应用程序必须保持后台状态。我在一个论坛上找到了来源。人们说代码是有效的,但对我来说,这代码不起作用。我不能拍照 请帮我修复这个代码。对不起,我的英语() 公共类CamService扩展服务{ 私有静态最终字符串标记=“CameraDemo”; 专用最终计划执行器服务计划程序= Executors.newScheduledThreadPool(1); 摄像机; 预定的未来蜂鸣器手柄; /*服务生命周期覆盖*/ @
公共类CamService扩展服务{
私有静态最终字符串标记=“CameraDemo”;
专用最终计划执行器服务计划程序=
Executors.newScheduledThreadPool(1);
摄像机;
预定的未来蜂鸣器手柄;
/*服务生命周期覆盖*/
@凌驾
public void onCreate(){
super.onCreate();
camera=camera.open();
试一试{
camera.setPreviewDisplay(空);
}捕获(IOE异常){
e、 printStackTrace();
}
定期服用(5);
}
@凌驾
公共空间{
stopPics();
super.ondestory();
}
@凌驾
公共IBinder onBind(意图arg0){
返回null;
}
/* ----------------------------------- */
私有IMyRemoteService.Stub myRemoteServiceStub=新的IMyRemoteService.Stub(){
/*基本服务方法*/
公共布尔值isCollecting(){
返回(蜂鸣器手柄!=null);
}
/* ------------------------- */
};
定期(长期)采取公共无效措施{
最终可运行蜂鸣器=新可运行(){
公开募捐
{
照相/摄像(快门回叫、画幅回叫、JPEG回叫);
}
};
camera.startPreview();
beeperHandle=scheduler.scheduleAtFixedRate(蜂鸣器,周期,周期,时间单位,秒);
}
公共图书馆{
蜂鸣器手柄。取消(真);
蜂鸣器手柄=空;
camera.stopPreview();
相机。释放();
摄像机=零;
}
/*摄像机回拨*/
ShutterCallback ShutterCallback=新建ShutterCallback(){
公共空间{
Log.d(标签“onShutter'd”);
}
};
/**处理原始图片的数据*/
PictureCallback rawCallback=新建PictureCallback(){
公共void onPictureTaken(字节[]数据,摄像头){
Log.d(标签“onPictureTaken-raw”);
}
};
/**处理j peg图片的数据*/
PictureCallback jpegCallback=新建PictureCallback(){
公共void onPictureTaken(字节[]数据,摄像头){
FileOutputStream扩展流=null;
试一试{
//写入本地沙盒文件系统
//outStream=CameraDemo.this.openFileOutput(String.format(“%d.jpg”,System.currentTimeMillis()),0);
//或者写到SD卡上
outStream=新文件OutputStream(String.format(“/sdcard/%d.jpg”,System.currentTimeMillis());
外扩。写入(数据);
exptream.close();
Log.d(标记“onPictureTaken-写入字节:”+data.length);
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}最后{
}
Log.d(标签“onPictureTaken-jpeg”);
}
};
}
您是否在清单文件中定义了服务?上面的代码在我的设备Android 2.3.6/Samsung S5360中运行良好,但当我在Samsung S7562中运行它时,它不起作用。我已经离开了这个项目,但如果我的想法不骗我,我会在清单中定义它
public class CamService extends Service {
private static final String TAG = "CameraDemo";
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(5);
}
@Override
public void onDestroy() {
stopPics();
super.onDestroy();
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
/* ----------------------------------- */
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()
{
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
outStream = new FileOutputStream(String.format("/sdcard/%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");
}
};
}