android - ScheduledExecutorService 在服务内部只运行一次

标签 android android-service scheduledexecutorservice

我正在我的服务内部运行 ScheduledExecutorService,它在后台拍摄图像。 ScheduledExecutorService running only once 表示函数传入的interval后只拍一张照片。完全没有显示错误。以下是我的服务

的代码
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,因为没有收到任何错误。服务也在拍照后运行。我做错了什么?

最佳答案

阅读这篇文章后 http://code.nomad-labs.com/2011/12/09/mother-fk-the-scheduledexecutorservice/我尝试了 try catch block 。并发现 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");
        }
    };

}

关于android - ScheduledExecutorService 在服务内部只运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24341959/

相关文章:

java - 检索 POJO 中的 firebase hashmap 数据

android - 从通知启动 Activity 会破坏父 Activity

java - 如何在服务类中设置ContentView以在打开时保护应用程序

java - Thread.sleep() 和 schedulerExecutorService.scheduleWithFixedDelay 的性能注意事项

java - 如何使用 ScheduledExecutorService 实现固定速率轮询器?

java - 在新线程中运行计划

android - 使用 cordova 文件插件访问 android 内部存储

Javascript Prompt() 在 Android 浏览器中出现暗淡(微弱)的提示消息

android - 在运行时请求位置权限

android - 更新小部件 onClick,启动服务似乎不起作用