5

カメラで写真を撮るために作業できた唯一のコードは、アクティビティから実行されます。サービス内から、またはサービスによって起動された AsyncTask から写真を撮ることが可能であることはかなり確信しています。

カメラ API には、UI に関連付ける必要がある SurfaceView が必要なようです。多分私は間違っています。サービスから写真を撮影できるコードを書いた人はいますか?

4

3 に答える 3

3

まだ探している場合は、より完全なコードを次に示します。サービスで動作します (テスト済み):

private void takePhoto() {

    System.out.println( "Preparing to take photo");
    Camera camera = null;

    int cameraCount = 0;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
        SystemClock.sleep(1000);

        Camera.getCameraInfo(camIdx, cameraInfo);

            try {
                camera = Camera.open(camIdx);
            } catch (RuntimeException e) {
                System.out.println("Camera not available: " + camIdx);
                camera = null;
                //e.printStackTrace();
            }
        try{
            if (null == camera) {
                System.out.println("Could not get camera instance");
            }else{
                System.out.println("Got the camera, creating the dummy surface texture");
                //SurfaceTexture dummySurfaceTextureF = new SurfaceTexture(0);
                try {
                    //camera.setPreviewTexture(dummySurfaceTextureF);
                    camera.setPreviewTexture(new SurfaceTexture(0));
                    camera.startPreview();
                } catch (Exception e) {
                    System.out.println("Could not set the surface preview texture");
                    e.printStackTrace();
                }
                camera.takePicture(null, null, new Camera.PictureCallback() {

                    @Override
                    public void onPictureTaken(byte[] data, Camera camera) {
                        File pictureFileDir = getDir();
                        if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) {
                            return;
                        }
                        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");
                        String date = dateFormat.format(new Date());
                        String photoFile = "PictureFront_" + "_" + date + ".jpg";
                        String filename = pictureFileDir.getPath() + File.separator + photoFile;
                        File mainPicture = new File(filename);
                        addImageFile(mainPicture);

                        try {
                            FileOutputStream fos = new FileOutputStream(mainPicture);
                            fos.write(data);
                            fos.close();
                            System.out.println("image saved");
                        } catch (Exception error) {
                            System.out.println("Image could not be saved");
                        }
                        camera.release();
                    }
                });
            }
        }catch (Exception e){
            camera.release();
        }


    }
于 2014-06-04T00:19:20.400 に答える
-3

カメラにはプレビュー画面が必要なので、これは不可能だと思います。ここで同様の質問を参照してください

于 2013-01-11T12:17:08.143 に答える