有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android无需用户交互即可拍照

我正在创建一个Android应用程序,需要一个无需用户交互即可拍照的功能

我只是想要一个类,比如“摄像服务”。java,它有一个用于获取相机设置(如质量、分辨率等)的构造函数和一个名为“takePhoto”的公共函数,该函数通过位图类型返回图像。我已经搜索了一段时间,想知道如何使用Camera API 2实现这一点,但每次都失败了

大多数这样做的示例都需要在MainActivity内部或扩展Activity的类中制作相机(我想尽量避免这种情况)

摄像服务。java

我使用了StackOverflow post(以下引用)中的以下代码,该代码只将图像保存到硬编码位置(并使用摄像头API 1),但我遇到了错误

package me.sam.camtest;
import 安卓.hardware.Camera;
import 安卓.util.Log;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CameraService {

    Camera mCamera;
    private int quality;

    public CameraService(int quality){
        this.quality = quality;
    }

    private int findBackFacingCamera() {
        int cameraId = -1;
        int numberOfCameras = Camera.getNumberOfCameras();
        for (int i = 0; i < numberOfCameras; i++) {
            Camera.CameraInfo info = new Camera.CameraInfo();
            Camera.getCameraInfo(i, info);
            if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
                cameraId = i;
                break;
            }
        }
        return cameraId;
    }

    private boolean safeCameraOpen(int id) {
        boolean qOpened = false;

        try {
            releaseCamera();
            mCamera = Camera.open(id);
            qOpened = (mCamera != null);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return qOpened;
    }

    private void releaseCamera() {
        if (mCamera != null) {
            mCamera.release();
            mCamera = null;
        }
    }

    Camera.PictureCallback mCall = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
            FileOutputStream outStream = null;
            try {
                outStream = new FileOutputStream("/sdcard/Image.jpg");
                outStream.write(data);
                outStream.close();
            } catch (FileNotFoundException e){
                Log.d("CAMERA", e.getMessage());
            } catch (IOException e){
                Log.d("CAMERA", e.getMessage());
            }
        }
    };

    public void takePhoto(){
        // Should return bitmap in future
        int back_cam = findBackFacingCamera();
        if(back_cam != -1){
            safeCameraOpen(1);
            mCamera.startPreview();
            mCamera.takePicture(null, null, mCall);
        }
    }
}

运行时错误:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: me.sam.camtest, PID: 985
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{me.sam.camtest/me.sam.camtest.MainActivity}: java.lang.RuntimeException: takePicture failed
                      at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
                      at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
                      at 安卓.app.ActivityThread.-wrap11(Unknown Source:0)
                      at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
                      at 安卓.os.Handler.dispatchMessage(Handler.java:106)
                      at 安卓.os.Looper.loop(Looper.java:164)
                      at 安卓.app.ActivityThread.main(ActivityThread.java:6494)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440)
                      at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:807)
                   Caused by: java.lang.RuntimeException: takePicture failed
                      at 安卓.hardware.Camera.native_takePicture(Native Method)
                      at 安卓.hardware.Camera.takePicture(Camera.java:1588)
                      at 安卓.hardware.Camera.takePicture(Camera.java:1530)
                      at me.sam.camtest.CameraService.takePhoto(CameraService.java:74)
                      at me.sam.camtest.Reply.<init>(Reply.java:47)
                      at me.sam.camtest.MainActivity.onCreate(MainActivity.java:80)
                      at 安卓.app.Activity.performCreate(Activity.java:6999)
                      at 安卓.app.Activity.performCreate(Activity.java:6990)
                      at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
                      at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
                      at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
                      at 安卓.app.ActivityThread.-wrap11(Unknown Source:0) 
                      at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
                      at 安卓.os.Handler.dispatchMessage(Handler.java:106) 
                      at 安卓.os.Looper.loop(Looper.java:164) 
                      at 安卓.app.ActivityThread.main(ActivityThread.java:6494) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440) 
                      at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:807)

researched发现了这个错误,人们似乎只能通过添加一个表面视图来修复它,该视图要求CameraService是一个活动或传递一个上下文(不是我想要的)

总之,我该如何实现以下目标:

  • 有一个简单的camera类,它有一个公共方法“takePhoto”,可以 返回位图
  • 避免在simple camera类中扩展活动或传递上下文
  • 在没有用户交互的情况下拍照(例如:意图)

PS:我是StackOverFlow社区的新手,我已经尽我最大的努力遵循这些指导原则,请不要太讨厌:)

我的研究:


共 (0) 个答案