以前写过的一个相机的service,不依赖于Activity,运行在service中,提供主要的操作接口
StartCamera
StopeCamera
TakePicture
主要思路是提供一个像素的surfaceView,这个view一直在最前,保证相机能运行并且拿到数据。然后通过相机的操作实现需要的功能。
一个像素的点的大概实现如下:
private void makeAndAddSurfaceView() {
SurfaceView dummyView = new SurfaceView(this.mApplication);
SurfaceHolder holder = dummyView.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
WindowManager wm = (WindowManager)this.mApplication.getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(1, 1,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSPARENT);
params.gravity = Gravity.TOP | Gravity.RIGHT;
params.alpha = PixelFormat.TRANSPARENT;
params.x = params.y = mApplication.getResources().getDimensionPixelOffset(
R.dimen.preview_surface_offset);
wm.addView(dummyView, params);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
dummyView.setAlpha(PixelFormat.TRANSPARENT);
}
//dummyView.getBackground().setAlpha(PixelFormat.TRANSPARENT);
mDummySurfaceView = dummyView;
}
等surfaceview创建完成后,打开相机,可以找到前置或者后置相机,根据自己的意图选择自己需要的相机
findFirstBackFacingCamera();
mCamera = Camera.open(mCameraId);
通过mCamera实现对相机的操作等。
详细代码就不写了。有需要的留言吧。