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();}
@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
- camera
- Camera
- camera
- Camera
- Camera
- camera
- camera
- Camera
- camera
- Camera
- Camera
- Camera
- camera
- camera
- camera
- camera
- camera
- Camera
- python string 使用正则表达式 split()
- configure: error: Cannot locate header file libintl.h 错误的解决方法
- VC++中调用EXCEL方法
- [LeetCode][1]Two Sum
- 双目视觉学习总结(1)——相机标定
- Camera
- 升级到IOS9以后,QQ授权登录和QQ分享出现问题,不能正常使用了(二)
- MapReduce 工作原理图
- CRM-优秀的任务调度框架Quartz
- Java笔记---多线程
- 利用开源工具搭一套汉英翻译系统(二):词对齐
- 条款51:编写new和delete时需固守常规
- Oracle中rownum用法详解
- 最大公约数与最小公倍数