Camera

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

                 |              |
   |      -------设置图片大小
           |
   --------设置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>
			@Override
			public void surfaceDestroyed(SurfaceHolder holder) {
				// surface已消失,必须停止绘制预览
				if(mCamera != null){
					mCamera.stopPreview();
				}
				
			}
			<span style="color:#33cc00;">//包含SurfaceView的视图层级结构被放到屏幕上时调用该方法,是Surface与其客户端进行关联的地方</span>
			@Override
			public 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>
			@Override
			public 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中进行:
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
		// TODO Auto-generated method stub
		super.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>
		@Override
		public 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>
		@Override
		public 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()中操作
	@Override
	public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值