关键技术:
SurfaceHolder.Callback
public class MyCameraDemo extends Activity { private SurfaceView surface = null ; private Button but = null ; private SurfaceHolder holder = null ; private Camera cam = null ; private boolean previewRunning = true ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.but = (Button) super.findViewById(R.id.but) ; this.surface = (SurfaceView) super.findViewById(R.id.surface) ; this.holder = this.surface.getHolder() ; this.holder.addCallback(new MySurfaceViewCallback()) ; //设置缓冲类型 this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) ; //设置分辨率 this.holder.setFixedSize(600, 350); this.but.setOnClickListener(new OnClickListenerImpl()) ; } private class OnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { if(MyCameraDemo.this.cam != null) { //自动对焦 MyCameraDemo.this.cam.autoFocus(new AutoFocusCallbackImpl()) ; } } } private class MySurfaceViewCallback implements SurfaceHolder.Callback { //当预览界面格式大小改变时,调用 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } //初次实例化界面调用 public void surfaceCreated(SurfaceHolder holder) { MyCameraDemo.this.cam = Camera.open(0) ; // 取得第一个摄像头 //窗口服务 WindowManager manager = (WindowManager) MyCameraDemo.this .getSystemService(Context.WINDOW_SERVICE); //取得display显示对象 Display display = manager.getDefaultDisplay() ; //照相机参数 Parameters param = MyCameraDemo.this.cam.getParameters() ; //将照相机预览大小设置为display大小 param.setPreviewSize(display.getWidth(), display.getHeight()) ; param.setPreviewFrameRate(5) ; // 一秒5帧 param.setPictureFormat(PixelFormat.JPEG) ; // 图片形式 param.set("jpen-quality", 80) ;//图片质量,最高100 MyCameraDemo.this.cam.setParameters(param) ; try { MyCameraDemo.this.cam.setPreviewDisplay(MyCameraDemo.this.holder) ; } catch (IOException e) { } MyCameraDemo.this.cam.startPreview() ; // 进行预览 MyCameraDemo.this.previewRunning = true ; // 已经开始预览 } @Override public void surfaceDestroyed(SurfaceHolder holder) { if(MyCameraDemo.this.cam != null) { if(MyCameraDemo.this.previewRunning) { MyCameraDemo.this.cam.stopPreview() ; // 停止预览 MyCameraDemo.this.previewRunning = false ; } MyCameraDemo.this.cam.release() ; } } } private class AutoFocusCallbackImpl implements AutoFocusCallback { @Override public void onAutoFocus(boolean success, Camera camera) { if(success) { // 成功 MyCameraDemo.this.cam.takePicture(sc, pc, jpgcall) ; } } } private PictureCallback jpgcall = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // 保存图片的操作 Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length); String fileName = Environment.getExternalStorageDirectory() .toString() + File.separator + "mldnphoto" + File.separator + "MLDN_" + System.currentTimeMillis() + ".jpg"; File file = new File(fileName) ; if (!file.getParentFile().exists()) { file.getParentFile().mkdirs() ; // 创建文件夹 } try { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)) ; bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos) ; // 向缓冲区之中压缩图片 bos.flush() ; bos.close() ; Toast.makeText(MyCameraDemo.this, "拍照成功,照片已保存在" + fileName + "文件之中!", Toast.LENGTH_SHORT) .show(); } catch (Exception e) { Toast.makeText(MyCameraDemo.this, "拍照失败!", Toast.LENGTH_SHORT) .show(); } MyCameraDemo.this.cam.stopPreview() ; MyCameraDemo.this.cam.startPreview() ; } } ; private ShutterCallback sc = new ShutterCallback(){ @Override public void onShutter() { // 按下快门之后进行的操作 } } ; private PictureCallback pc = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { } } ; }
主布局函数
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/but" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="照相" /> <SurfaceView android:id="@+id/surface" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
相关推荐
对于Android平台,Qt提供了与原生系统功能交互的能力,例如调用安卓照相机。本文将深入探讨如何在Qt应用中实现这一功能,涉及的技术包括摄像、打开相册、拍照以及播放摄像视频。 首先,我们需要理解Qt是如何在...
本资源"android照相机应用源码"提供了一个可以直接运行的Android相机应用示例,这对于初学者和有经验的开发者来说都是一个宝贵的参考资料。 首先,我们需要了解Android相机API的基础知识。在Android 3.0(API级别11...
从提供的标题"安卓照相机TakePhoto.zip"和描述来看,这个压缩包文件应该包含了一个完整的Android Studio项目,用于实现一个解决常见问题(如按钮闪退、存储问题以及速度优化)的照相应用程序。以下是对这些知识点的...
android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo
在Android系统中,照相机功能是用户日常使用的重要部分,深入了解Android照相机的源码有助于开发者优化拍照体验、实现自定义功能或者解决相关问题。本文将深入探讨Android照相机源码,涵盖其核心组件、工作流程以及...
本篇文章将详细探讨Android照相机移动对焦的相关知识点,包括基本概念、API使用、实现流程以及常见问题。 首先,我们需要理解移动对焦的工作原理。在传统的数码相机中,移动对焦通过调整镜头位置来实现。而在智能...
12. **专业模式**:在一些高级安卓手机中,提供了类似单反相机的专业模式,允许用户手动控制快门速度、光圈、ISO等参数。 最后,关于隐私和安全,需要注意的是: 1. **权限管理**:安卓系统会提示用户给予照相机...
在Android平台上,照相机功能是应用开发中的一个重要组成部分,它为用户提供在线拍照和浏览图片的能力。这个特定的项目或教程,名为"Day4_16_camera",显然聚焦于教授如何在Android应用中集成和利用照相机功能。下面...
本篇将深入探讨“android安卓相机改革源码”所涉及的关键知识点,以及如何通过这些知识点来优化应用的相机功能。 1. **Camera2 API的使用**: - 传统的`Camera` API已经被更先进的`Camera2` API取代。`Camera2`...
在Android平台上,照相机功能是应用开发者经常打交道的一部分。Android提供了丰富的API来支持开发者构建功能齐全...通过理解和研究源代码,可以更深入地掌握Android照相机功能的实现原理,从而创建出更优质的相机应用。
如果不能使用,请修改根目录下的project.property的android:target为你当前有的target(不知道怎么改的同学可以从8到21一个个数字去试哦) 程序实现点击屏幕后聚焦拍照功能,并把图片存入sd卡camera目录下。但打开时无...
通过理解和掌握以上知识点,开发者可以构建出具有专业自动对焦功能的Android照相机应用,满足用户在不同环境下的拍摄需求。无论是简单地使用系统提供的API,还是深入到更复杂的`Camera2` API,都可以实现高质量的...
这个"Android照相机触屏对焦例子"将引导我们了解如何实现这一功能。Android提供了丰富的API来支持摄像头操作,包括触屏对焦。我们将深入探讨以下几个关键知识点: 1. **Camera API与Camera2 API**: Android提供了...
本项目标题为“android照相机相册选择,可以多选”,说明它实现了在Android平台上让用户能够通过自定义的方式,不仅能够使用相机拍摄照片,还能够从相册中选取多张图片,并且具备删除已选择图片的功能。这一特性极大...
本篇将详细探讨Android照相机的源码,帮助你深入理解这一核心组件的工作原理。 Android的相机服务是系统服务之一,位于框架层,主要负责管理硬件资源,提供API供上层应用调用。源码主要分布在以下几个关键模块: 1...
在Android开发中,实现“Android 照相机裁切图片”的功能是常见的需求,尤其是在社交应用或者图片处理类应用中。这个功能允许用户拍摄照片后,根据自己的需要选择并调整图片的展示区域,以便精确地选取想要的部分。...
本文将深入探讨Android照相机开发的相关知识点,包括API的使用、权限管理、相机配置、预览显示、图片捕获以及一些常见问题的解决策略。 1. **Android Camera API** Android提供了多种方式来访问和控制照相机。早期...
一个常见的需求是H5页面能够调用Android设备的相机进行拍照,以实现更丰富的用户体验。本知识点将详细阐述如何在H5中调用Android本地相机进行拍照,并确保在Android 5.0、6.0等不同版本系统上的兼容性。 首先,我们...