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) 个答案