`

安卓照相机

阅读更多

关键技术:

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>

 

0
0
分享到:
评论

相关推荐

    Qt调用原生安卓照相机

    对于Android平台,Qt提供了与原生系统功能交互的能力,例如调用安卓照相机。本文将深入探讨如何在Qt应用中实现这一功能,涉及的技术包括摄像、打开相册、拍照以及播放摄像视频。 首先,我们需要理解Qt是如何在...

    android照相机应用源码

    本资源"android照相机应用源码"提供了一个可以直接运行的Android相机应用示例,这对于初学者和有经验的开发者来说都是一个宝贵的参考资料。 首先,我们需要了解Android相机API的基础知识。在Android 3.0(API级别11...

    安卓照相机TakePhoto.zip

    从提供的标题"安卓照相机TakePhoto.zip"和描述来看,这个压缩包文件应该包含了一个完整的Android Studio项目,用于实现一个解决常见问题(如按钮闪退、存储问题以及速度优化)的照相应用程序。以下是对这些知识点的...

    android 照相机 demo

    android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo

    android 照相机源码 Camera源码

    在Android系统中,照相机功能是用户日常使用的重要部分,深入了解Android照相机的源码有助于开发者优化拍照体验、实现自定义功能或者解决相关问题。本文将深入探讨Android照相机源码,涵盖其核心组件、工作流程以及...

    Android照相机移动对焦例子

    本篇文章将详细探讨Android照相机移动对焦的相关知识点,包括基本概念、API使用、实现流程以及常见问题。 首先,我们需要理解移动对焦的工作原理。在传统的数码相机中,移动对焦通过调整镜头位置来实现。而在智能...

    打开安卓照相机

    12. **专业模式**:在一些高级安卓手机中,提供了类似单反相机的专业模式,允许用户手动控制快门速度、光圈、ISO等参数。 最后,关于隐私和安全,需要注意的是: 1. **权限管理**:安卓系统会提示用户给予照相机...

    android 安卓 照相机 支持 在线拍照、浏览

    在Android平台上,照相机功能是应用开发中的一个重要组成部分,它为用户提供在线拍照和浏览图片的能力。这个特定的项目或教程,名为"Day4_16_camera",显然聚焦于教授如何在Android应用中集成和利用照相机功能。下面...

    android安卓相机改革源码

    本篇将深入探讨“android安卓相机改革源码”所涉及的关键知识点,以及如何通过这些知识点来优化应用的相机功能。 1. **Camera2 API的使用**: - 传统的`Camera` API已经被更先进的`Camera2` API取代。`Camera2`...

    android照相机

    在Android平台上,照相机功能是应用开发者经常打交道的一部分。Android提供了丰富的API来支持开发者构建功能齐全...通过理解和研究源代码,可以更深入地掌握Android照相机功能的实现原理,从而创建出更优质的相机应用。

    android camera out of memory安卓照相机OOM问题的解决

    如果不能使用,请修改根目录下的project.property的android:target为你当前有的target(不知道怎么改的同学可以从8到21一个个数字去试哦) 程序实现点击屏幕后聚焦拍照功能,并把图片存入sd卡camera目录下。但打开时无...

    Android照相机自动对焦例子

    通过理解和掌握以上知识点,开发者可以构建出具有专业自动对焦功能的Android照相机应用,满足用户在不同环境下的拍摄需求。无论是简单地使用系统提供的API,还是深入到更复杂的`Camera2` API,都可以实现高质量的...

    Android照相机触屏对焦例子

    这个"Android照相机触屏对焦例子"将引导我们了解如何实现这一功能。Android提供了丰富的API来支持摄像头操作,包括触屏对焦。我们将深入探讨以下几个关键知识点: 1. **Camera API与Camera2 API**: Android提供了...

    android照相机相册选择,可以多选

    本项目标题为“android照相机相册选择,可以多选”,说明它实现了在Android平台上让用户能够通过自定义的方式,不仅能够使用相机拍摄照片,还能够从相册中选取多张图片,并且具备删除已选择图片的功能。这一特性极大...

    android 照相机源码

    本篇将详细探讨Android照相机的源码,帮助你深入理解这一核心组件的工作原理。 Android的相机服务是系统服务之一,位于框架层,主要负责管理硬件资源,提供API供上层应用调用。源码主要分布在以下几个关键模块: 1...

    Android 照相机裁切图片

    在Android开发中,实现“Android 照相机裁切图片”的功能是常见的需求,尤其是在社交应用或者图片处理类应用中。这个功能允许用户拍摄照片后,根据自己的需要选择并调整图片的展示区域,以便精确地选取想要的部分。...

    Android 照相机

    本文将深入探讨Android照相机开发的相关知识点,包括API的使用、权限管理、相机配置、预览显示、图片捕获以及一些常见问题的解决策略。 1. **Android Camera API** Android提供了多种方式来访问和控制照相机。早期...

    H5 调用android 相机拍照

    一个常见的需求是H5页面能够调用Android设备的相机进行拍照,以实现更丰富的用户体验。本知识点将详细阐述如何在H5中调用Android本地相机进行拍照,并确保在Android 5.0、6.0等不同版本系统上的兼容性。 首先,我们...

Global site tag (gtag.js) - Google Analytics