我有一个在后台拍照的服务......这个服务以三种模式工作:
- 前置摄像头
- 后置摄像头
- 带闪光灯的后置摄像头
前两个效果很好,但是当为相机参数启用闪光灯时,“Camera.PictureCallback”中没有返回图像... 事实上,回调永远不会被触发。
闪光灯闪光,一切正常,但没有收到图像。
这是我的 onStartCommand :
public int onStartCommand(Intent intent, int flags, int startId) {
try {
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_TOAST,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP | Gravity.START;
params.width = 1;
params.height = 1;
params.x = 0;
params.y = 0;
sv = new SurfaceView(getApplicationContext());
windowManager.addView(sv, params);
SurfaceHolder sHolder = sv.getHolder();
sHolder.addCallback(this);
} catch (Exception e) {
e.printStackTrace();
}
return START_NOT_STICKY;
}
这是我的相机初始化代码:
myCamera = Camera.open();
if (myCamera != null) {
myCamera.setPreviewDisplay(sv.getHolder());
Camera.Parameters parameters = myCamera.getParameters();
parameters.setFlashMode(FLASH_MODE_ON);
parameters.setPictureFormat(ImageFormat.JPEG);
parameters.setJpegQuality(70);
// set camera parameters
myCamera.setParameters(parameters);
myCamera.startPreview();
myCamera.setErrorCallback(errorCallBack);
myCamera.takePicture(mShutter, null, mCall);
}
最佳答案
我使用以下代码,它适用于 Samsung Galaxy 6、7; Moto G4、LG(我不记得型号了)。
public void onMyClick(View v){
startTakingPictures();
}
private void startTakingPictures() {
try {
android.hardware.Camera cam = android.hardware.Camera.open();
if (cam != null) {
int presentOrientation = getResources().getConfiguration().orientation;
SurfaceView sv = new SurfaceView(getBaseContext());
cam.setPreviewDisplay(sv.getHolder());
Camera.Parameters para = cam.getParameters();
para.setRotation(ORIENTATIONS.get(presentOrientation));
para.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
// Log.e(TAG, "lat lng == " + loc.getLatitude());
// para.setGpsLatitude(loc.getLatitude());
// para.setGpsLongitude(loc.getLongitude());
cam.setParameters(para);
cam.startPreview();
cam.takePicture(null, null, getJpegCallBack());
}
}
catch (Exception ex){
Log.e(TAG, ex.getMessage());
}
}
private Camera.PictureCallback getJpegCallBack() {
Camera.PictureCallback jpg = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream fos;
String path = getPathBaseName();
if(path.isEmpty()){
return;
}
path = "image.jpg";
Log.e(TAG, "Image path == " + path);
try {
fos = new FileOutputStream(path);
fos.write(data);
fos.close();
}
catch (Exception ex) {
Log.e(TAG, ex.getMessage());
}
}
};
return jpg;
}
编辑:
由于 Camera
现已贬值,您可能需要实现 android.hardware.camera2
。
您的设备支持的参数类型似乎有问题。查看可用的闪存参数:
Camera.Parameters para = cam.getParameters();
for(String s : para.getSupportedFlashModes()){
Log.e(TAG, "Supported Flash Mode = " + s);
}
您可能需要像这样设置闪光灯模式:
param.set("flash-mode", "on");
cam.setParameters(param);
除此之外,您可能还想查看 Karl Morrison 在这篇文章中的实现: Android camera: stopPreview vs releaseCamera
关于android - 用闪光灯拍照不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46637382/