CameraService

以前在开发中遇到过一个项目,需要调用手机的拍照,并把照片传过去。但是拍照时手机不能让用户看到相机打开。

思路是启动一个service,service中实现一个surfaceview,surfaceview是一个像素的点,这样就防止了用户看到相机被打开。

先看surfaceview的实现:

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创建成功后,调用相机的打开,相机的打开是Camera的静态函数 Camera.open()

打开camera后,可以设置previe的fps,大小,类型等。

实现如下:

	private void startRecorder() throws IOException {
		// if (checkCameraHardware(this.mApplication)) {
		if (mCameraId < 0) {
			findFirstBackFacingCamera();
		}

		if (mCamera == null || !isStarted()) {
			try {
				mCamera = Camera.open(mCameraId);
			} catch (RuntimeException exception) {
				synchronized (cameraLock) {
					mRecordingState = CameraState.NOT_RECORDING;
					cameraLock.notifyAll();
				}
				return;
			}
		}
		// }

		if (mCamera == null) {
			return;// throw new
					// UnsupportedOperationException("No camera present");
		}

		mCamera.setPreviewDisplay(mDummySurfaceHolder);

		Camera.Parameters params = mCamera.getParameters();
		List<Size> supportSizes = mCamera.getParameters()
				.getSupportedPictureSizes();
		int format = params.getPreviewFormat();
		Size size = params.getPreviewSize();
		int[] CurPreRange = new int[2];
		params.getPreviewFpsRange(CurPreRange);
		params.setPreviewFpsRange(CurPreRange[0], CurPreRange[1]);

		// params.setPictureFormat(ImageFormat.JPEG);
		if (isBackCamera && DEFAULT_ORIENTATION != -1) {
			params.setRotation(DEFAULT_ORIENTATION);
		} else if (DEFAULT_ORIENTATION != -1) {
			params.setRotation(360 - DEFAULT_ORIENTATION);
		}
		Size targetSize = getTargetPreviewSize(supportSizes);
		if (targetSize != null) {
			params.setPictureSize(targetSize.width, targetSize.height);
		}
		try {
			mCamera.setParameters(params);
		} catch (Exception e) {
			logger.fine(e.getMessage());
		}
		int[] frameRates = new int[2];
		Log.w(TAG,
				"Camera properties: bpp=" + ImageFormat.getBitsPerPixel(format)
						+ "; format=" + format + "; size=" + size.width + "x"
						+ size.height + "; frameRates=" + frameRates[0] + "-"
						+ frameRates[1]);

		mCamera.setPreviewCallback(mJpegPreviewCallback);
		try {
			mCamera.startPreview(); // Recording is now started
		} catch (RuntimeException e) {
			stopCameraInternal();
			throw e;
		}

		mRecordingState = CameraState.RECORDING;
	}

相机的回调如下:这回调里,就可以拿到相机的数据,根据需要响应的处理了。

private PreviewCallback
mJpegPreviewCallback =
new Camera.PreviewCallback()
{

public
void onPreviewFrame(byte[]
data,
Camera camera)
{

}

时间: 2024-12-21 17:09:30

CameraService的相关文章

Camera从应用到CameraService分析

文章根据这个整理而成.http://blog.chinaunix.net/uid-25314474-id-2938255.html.找到最后才发现上面介绍的Camera竟然是基于Android1.0写的文章,顿时泪奔,不过也能从中学到知识.可以通过    http://androidxref.com/  在线查看源码进行学习. 我6月4号写了大概,现在把native的binder看了一遍,再来缕下camera代码.  很多知识是从安卓框架揭秘看的. 写在前面的话android_hardware_

Android多媒体开发介绍(转)

Android多媒体开发介绍 转自:http://blog.csdn.net/reiliu/article/details/9060557 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3.AAC.AMR.JPG.PNG.GIF等.从功能上分为两部分,一是音/视频的回放(PlayBack),二是音视频的纪录(Recorder). CODEC(编解码器)使用OpenMAX 1L

Android的系统服务一览

System_Server进程 运行在system server进程中的服务比较多,这是整个Android框架的基础 Native服务 SurfaceFlinger 这是framebuffer合成的服务,将各个应用程序及应用程序中的逻辑窗口图像数据(surface)合成到一个物理窗口中显示(framebuffer)的服务程序 Java服务:http://hovertree.com/menu/java/这部分的服务大部分都有一个供应用进程使用的manager类,这就是一个RPC调用,用户通过调用x

android从应用到驱动之—camera(2)---cameraHAL的实现

本来想用这一篇博客把cameraHAL的实现和流程都给写完的.搞了半天,东西实在是太多了.这篇先写cameraHAL的基本实现框架,下一篇在具体写camerahal的流程吧. cameraHAL的实现: 对于初学者来说,最大的疑问是系统是如何调用hardware的.这里就以camera来举例说明.调用hardware的程序是cameraservice,我们就去它里面看看它是如何找到hardware的 先把源码贴上来: /* ** ** Copyright (C) 2008, The Androi

System进程的启动流程第二部分

继System进程的启动流程第一部分,我们接着分析com.android.server.SystemServer的main函数.如下: public class SystemServer { ...... native public static void init1(String[] args); ...... public static void main(String[] args) { ...... init1(args); ...... } public static final vo

从源码角度分析Android中的Binder机制的前因后果

前面我也讲述过一篇文章<带你从零学习linux下的socket编程>,主要是从进程通信的角度开篇然后延伸到linux中的socket的开发.本篇文章依然是从进程通信的角度去分析下Android中的进程通信机制. 为什么在Android中使用binder通信机制? 众所周知linux中的进程通信有很多种方式,比如说管道.消息队列.socket机制等.socket我们再熟悉不过了,然而其作为一款通用的接口,通信开销大,数据传输效率低,主要用在跨网络间的进程间通信以及在本地的低速通信.消息队列和管道

Camera框架简介

Camera应用是android多媒体系统中典型的采用C/S架构设计的应用,Client和Server在两个独立的线程间通过Binder机制通信.下面是Camera的总体构架图. 从应用层的Camera.java(packages\app\Camera),到framework java部分的Camera.java(framework\base\core\java\android\hardware),再到JNI层的android_hardware_camera(framework\base\cor

(转)android从应用到驱动之—camera(1)---程序调用流程

一.开篇 写博客还得写开篇介绍,可惜,这个不是我所擅长的.就按我自己的想法写吧. 话说camera模块,从上层到底层一共包含着这么几个部分: 1.apk------java语言 2.camera的java接口----java语言 3.camera的java接口的具体实现,即所谓的JNI-----(java—>C++) 4.camera客户端-----C++语言 5.camera服务器----C++语言 6.camera硬件抽象层,即所谓的HAL------C++语言 7.camera驱动 如上也

CameraManager与CameraDevice与ICameraService的对应关系

Camera2 AP Framewok中有三个比较重要的组件:CameraManager.CameraDevice.ICameraService,他们的对应关系如下: 一个Context中会有一个CameraManager实例, 一个CameraManager实例又可以有多个CameraDevice实例(具体能有多少个是由CameraService.MAX_CAMERAS决定) ICameraService实例只有一个,它能管理多个CameraManager CameraManager与Came