Camera

来源:互联网 发布:c语言表达式的值 编辑:程序博客网 时间:2024/05/17 08:33

权限--判断--打开--预览--拍照--关闭--查看

                |              |
   |     -------设置图片大小
           |
   --------设置surfaceview大小
   |
   --------全屏显示     

权限:

<uses-permission android:name="android.permission.CAMERA"/><uses-feature android:name="android.hardware.camera"/>


判断: 

 PackageManager packageManager = getActivity().getPackageManager();boolean hasCamera = packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)||packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)||Build.VERSION.SDK_INT>=Build.VERSION_CODES.GINGERBREAD || Camera.getNumberOfCameras()>0;

打开:

打开相机
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.GINGERBREAD){mCamera = Camera.open(0);}else{mCamera = Camera.open();}


预览:

SurfaceView类实现了SurfaceHolder接口,当SurfaceView出现在屏幕上时,会创建Surface;其随SurfaceView从屏幕消失而被销毁。当Surface不存在时要保证没有任何内容要在其上绘制。(SurfaceHolder是我们与Surface对象联系的纽带,Surface对象代表着原始像素数据的缓冲区)
mSurfaceView = (SurfaceView) view.findViewById(R.id.surfaceView1);SurfaceHolder <span style="color:#ff0000;">holder </span>= mSurfaceView.getHolder();<span style="color:#ff0000;">holder</span>.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);<span style="color:#ff0000;">holder</span>.addCallback(new SurfaceHolder.Callback() {<span style="color:#33cc00;">//SurfaceView从屏幕上移除,Surface也随即被销毁,通知客户端停止绘制</span>@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// surface已消失,必须停止绘制预览if(mCamera != null){mCamera.stopPreview();}}<span style="color:#33cc00;">//包含SurfaceView的视图层级结构被放到屏幕上时调用该方法,是Surface与其客户端进行关联的地方</span>@Overridepublic void surfaceCreated(SurfaceHolder holder) {//告知camera在这个surface上显示预览try {if(mCamera != null){Toast.makeText(getActivity(), "start", Toast.LENGTH_SHORT).show();mCamera.setPreviewDisplay(holder);mCamera.startPreview();}} catch (IOException e) {Log.e(TAG, "error setting up preview diaplay");}}<span style="color:#33cc00;">//Surface首次显示在屏幕上时调用该方法,传入参数告知Surface的像素格式以及宽高,通知客户端绘制区域有多大。</span>@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {if(mCamera == null)return;//当surface大小改变时也要相应地改变相机预览大小Camera.Parameters parameters = mCamera.getParameters();Size size =g<span style="color:#996633;">etBestSupportedSize</span>(parameters.getSupportedPreviewSizes(), width, height);parameters.setPreviewSize(size.width, size.height);size = <span style="color:#996633;">getBestSupportedSize</span>(parameters.getSupportedPictureSizes(), width, height);parameters.setPictureSize(size.width, size.height);mCamera.setParameters(parameters);try {mCamera.startPreview();} catch (Exception e) {Log.e(TAG, "could not start preview", e);mCamera.release();mCamera = null;}}});return view;}

去掉操作栏要在Activity中进行:
@Overrideprotected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);}

拍照:即从相机的实时预览中捕获一帧图像

Camera方法:public final void takePicture(Camera.ShutterCallback shutter,Camera.PictureCallback raw,CameraPictureCallback jpeg)
实现要传入的两个接口:没实现的给NULL即可
<span style="white-space:pre"></span>private Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback() {<span style="color:#33cc00;">//当相机捕获图像时调用,此时图像数据还未处理完,可以显示一只进度条</span>@Overridepublic void onShutter() {mProgressContainer.setVisibility(View.VISIBLE);}};private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {<span style="color:#009900;">//JPEG版本的图像可用时调用,可以在这里<span style="background-color: rgb(255, 255, 102);">保存图片</span></span>@Overridepublic void onPictureTaken(byte[] data, Camera camera) {Toast.makeText(getActivity(), "getting picture...", Toast.LENGTH_SHORT).show();String filename = new Date().toString()+".jpg";FileOutputStream outputStream = null;boolean success = true;try {outputStream = getActivity().openFileOutput(filename, Context.MODE_PRIVATE);outputStream.write(data);} catch (Exception e) {Toast.makeText(getActivity(), "error writting to file", Toast.LENGTH_SHORT).show();success = false;}finally{try {if(outputStream != null){outputStream.close();}} catch (Exception e) {Toast.makeText(getActivity(), "error closing file", Toast.LENGTH_SHORT).show();success = false;}}if(success){Toast.makeText(getActivity(), "JPEG saved at "+filename, Toast.LENGTH_SHORT).show();}FragmentManager fragmentManager = getActivity().getFragmentManager();String path = getActivity().getFileStreamPath(filename).getAbsolutePath();ImageFragment.newInstance(path).show(getChildFragmentManager(), "image");}};

关闭:在opPause()中操作
@Overridepublic void onPause() {if(mCamera != null){mCamera.release();mCamera = null;}super.onPause();}

查看:

<span style="white-space:pre"></span>mImageView = new ImageView(getActivity());BitmapDrawable image = PictureUtils.getScaledDrawable(getActivity(), filepath);mImageView.setImageDrawable(image);


工具类:找出设备支持的最佳尺寸

private Size getBestSupportedSize(List<Size> sizes,int width,int height){Size bestSize = sizes.get(0);int largestArea = bestSize.width * bestSize.height;for(Size size : sizes){int area = size.width * size.height;if(area >largestArea){bestSize = size;largestArea = area;}}return bestSize;}

图片处理:缩小图片、清除图片

public class PictureUtils {public static BitmapDrawable getScaledDrawable(Activity a, String path) {Display display = a.getWindowManager().getDefaultDisplay();float destWidth = display.getWidth();float destHeight = display.getHeight();BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFile(path, options);float scrWidth = options.outWidth;float scrHeight = options.outHeight;int inSampleSize = 1;if (scrHeight > destHeight || scrWidth > destWidth) {if (scrWidth > scrHeight) {inSampleSize = Math.round(scrHeight / destHeight);} else {inSampleSize = Math.round(scrWidth / destWidth);}}options = new BitmapFactory.Options();options.inSampleSize = inSampleSize;Bitmap bitmap = BitmapFactory.decodeFile(path, options);return new BitmapDrawable(a.getResources(), bitmap);}public static void cleanImageView(ImageView imageView){if(!(imageView.getDrawable() instanceof BitmapDrawable))return;BitmapDrawable bitmapDrawable = (BitmapDrawable) imageView.getDrawable();bitmapDrawable.getBitmap().recycle();imageView.setImageDrawable(null);}}

注:本文代码修改自 《Android编程权威指南》



0 0