/** Copyright (C) 2007 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.invisible.camera;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.hardware.Camera;import android.hardware.Camera.CameraInfo;import android.hardware.Camera.Size;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.ViewGroup;import android.view.Window;import android.view.WindowManager;import java.io.IOException;import java.util.List;// ----------------------------------------------------------------------public class CameraPreview extends Activity {private Preview mPreview;Camera mCamera;int numberOfCameras;int cameraCurrentlyLocked;// The first rear facing cameraint defaultCameraId;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Hide the window title.requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);// Create a RelativeLayout container that will hold a SurfaceView,// and set it as the content of our activity.mPreview = new Preview(this);setContentView(mPreview);// Find the total number of cameras availablenumberOfCameras = Camera.getNumberOfCameras();// Find the ID of the default cameraCameraInfo cameraInfo = new CameraInfo();for (int i = 0; i < numberOfCameras; i++) {Camera.getCameraInfo(i, cameraInfo);if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {defaultCameraId = i;}}}@Overrideprotected void onResume() {super.onResume();// Open the default i.e. the first rear facing camera.mCamera = Camera.open();cameraCurrentlyLocked = defaultCameraId;mPreview.setCamera(mCamera);}@Overrideprotected void onPause() {super.onPause();// Because the Camera object is a shared resource, it's very// important to release it when the activity is paused.if (mCamera != null) {mPreview.setCamera(null);mCamera.release();mCamera = null;}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate our menu which can gather user input for switching cameraMenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.camera_menu, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle item selectionswitch (item.getItemId()) {case R.id.switch_cam:// check for availability of multiple camerasif (numberOfCameras == 1) {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setMessage(this.getString(R.string.camera_alert)).setNeutralButton("Close", null);AlertDialog alert = builder.create();alert.show();return true;}// OK, we have multiple cameras.// Release this camera -> cameraCurrentlyLockedif (mCamera != null) {mCamera.stopPreview();mPreview.setCamera(null);mCamera.release();mCamera = null;}// Acquire the next camera and request Preview to reconfigure// parameters.mCamera = Camera.open((cameraCurrentlyLocked + 1) % numberOfCameras);cameraCurrentlyLocked = (cameraCurrentlyLocked + 1)% numberOfCameras;mPreview.switchCamera(mCamera);// Start the previewmCamera.startPreview();return true;default:return super.onOptionsItemSelected(item);}}}// ----------------------------------------------------------------------/*** A simple wrapper around a Camera and a SurfaceView that renders a centered preview of the Camera* to the surface. We need to center the SurfaceView because not all devices have cameras that* support preview sizes at the same aspect ratio as the device's display.*/class Preview extends ViewGroup implements SurfaceHolder.Callback {private final String TAG = "Preview";SurfaceView mSurfaceView;SurfaceHolder mHolder;Size mPreviewSize;List<Size> mSupportedPreviewSizes;Camera mCamera;Preview(Context context) {super(context);mSurfaceView = new SurfaceView(context);addView(mSurfaceView);// Install a SurfaceHolder.Callback so we get notified when the// underlying surface is created and destroyed.mHolder = mSurfaceView.getHolder();mHolder.addCallback(this);mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}public void setCamera(Camera camera) {mCamera = camera;if (mCamera != null) {mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();requestLayout();}}public void switchCamera(Camera camera) {setCamera(camera);try { camera.setPreviewDisplay(mHolder); } catch (IOException exception) {Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);}Camera.Parameters parameters = camera.getParameters();parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);requestLayout();camera.setParameters(parameters);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// We purposely disregard child measurements because act as a// wrapper to a SurfaceView that centers the camera preview instead// of stretching it.final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);setMeasuredDimension(width, height);if (mSupportedPreviewSizes != null) {mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);}}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {if (changed && getChildCount() > 0) {final View child = getChildAt(0);final int width = r - l;final int height = b - t;int previewWidth = width;int previewHeight = height;if (mPreviewSize != null) {previewWidth = mPreviewSize.width;previewHeight = mPreviewSize.height;}// Center the child SurfaceView within the parent.if (width * previewHeight > height * previewWidth) {final int scaledChildWidth = previewWidth * height / previewHeight;child.layout((width - scaledChildWidth) / 2, 0,(width + scaledChildWidth) / 2, height);} else {final int scaledChildHeight = previewHeight * width / previewWidth;child.layout(0, (height - scaledChildHeight) / 2,width, (height + scaledChildHeight) / 2);}}}public void surfaceCreated(SurfaceHolder holder) {// The Surface has been created, acquire the camera and tell it where// to draw.try {if (mCamera != null) {mCamera.setPreviewDisplay(holder);}} catch (IOException exception) {Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);}}public void surfaceDestroyed(SurfaceHolder holder) {// Surface will be destroyed when we return, so stop the preview.if (mCamera != null) {mCamera.stopPreview();}}private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {final double ASPECT_TOLERANCE = 0.1;double targetRatio = (double) w / h;if (sizes == null) return null;Size optimalSize = null;double minDiff = Double.MAX_VALUE;int targetHeight = h;// Try to find an size match aspect ratio and sizefor (Size size : sizes) {double ratio = (double) size.width / size.height;if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;if (Math.abs(size.height - targetHeight) < minDiff) {optimalSize = size;minDiff = Math.abs(size.height - targetHeight);}}// Cannot find the one match the aspect ratio, ignore the requirementif (optimalSize == null) {minDiff = Double.MAX_VALUE;for (Size size : sizes) {if (Math.abs(size.height - targetHeight) < minDiff) {optimalSize = size;minDiff = Math.abs(size.height - targetHeight);}}}return optimalSize;}public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {// Now that the size is known, set up the camera parameters and begin// the preview.Camera.Parameters parameters = mCamera.getParameters();parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);requestLayout();mCamera.setParameters(parameters);mCamera.startPreview();}}

更多相关文章

  1. 代码中设置drawableleft
  2. android 3.0 隐藏 系统标题栏
  3. Android开发中activity切换动画的实现
  4. Android(安卓)学习 笔记_05. 文件下载
  5. Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
  6. 技术博客汇总
  7. android 2.3 wifi (一)
  8. AndRoid Notification的清空和修改
  9. Android中的Chronometer

随机推荐

  1. android suport respository和Android Su
  2. Android笔记: Android版本号
  3. Beginning Android 4--Exercises 1
  4. Android之打开闪光灯关键代码
  5. 自定义progressbar使用图片
  6. Android 获取剩余存储空间
  7. Android中全屏无标题设置(Android学习随笔
  8. Android性能测试(内存、cpu、fps、流量、G
  9. Shape实现圆形图片
  10. Android 启动界面Splash