Camera
2015-09-29 15:54
357 查看
权限--判断--打开--预览--拍照--关闭--查看
| ||
-------设置图片大小
|
--------设置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编程权威指南》
相关文章推荐
- 请用一句话概括JSONP
- shell脚本: linux系统的负载与CPU、内存、硬盘、用户数监控
- Bundle作用及使用方法
- CF581D三个矩形能否构成一个无空隙的正方形
- configure: error: Cannot locate header file libintl.h 错误的解决方法
- 使用 xcodebuild 从 archive 导出 ipa
- ListView工作流程
- VC++中调用EXCEL方法
- 2015合肥网络赛 HDU 5492 Find a path 动归
- EasyUI - Tabs
- struts.xml配置文件(二)
- SQL中的一些简单语法总结
- Apache上配置反向代理以及负载均衡配置
- 如何使用手机作为树莓派的显示屏幕
- Android 吸入动画效果实现分解
- 深入浅出 RPC - 深入篇
- js返回顶部
- 开源软件的许可协议 License
- 九月英语学习
- linux应用编程笔记(5)系统调用文件编程方法实现文件复制