系统使用详解之拍照-阿里云开发者社区

开发者社区> eclipse_xu> 正文

系统使用详解之拍照

简介: 在Android中调用摄像头进行拍照有两种方式,一种是使用系统的拍照Activity,另一种是使用Camera对象自己实现拍照功能 一、调用系统拍照Activity public class Main extends Activity implements OnClickListen...
+关注继续查看

在Android中调用摄像头进行拍照有两种方式,一种是使用系统的拍照Activity,另一种是使用Camera对象自己实现拍照功能

一、调用系统拍照Activity

public class Main extends Activity implements OnClickListener
{
	public ImageView imageView;
	private ImageView ivFocus;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Button btnTakePicture = (Button) findViewById(R.id.btnTakePicture);
		btnTakePicture.setOnClickListener(this);
		imageView = (ImageView) findViewById(R.id.imageview);
		ivFocus = new ImageView(this);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		if (requestCode == 1)
		{
			if (resultCode == Activity.RESULT_OK)
			{
				Bitmap cameraBitmap = (Bitmap) data.getExtras().get("data");
				imageView.setImageBitmap(cameraBitmap);				
				//  存成320*240和50*50  如果是垂直方向,需要对cameraBitmap旋转90度
				MediaStore.Images.Media.insertImage(getContentResolver(), cameraBitmap, null, null);

			}
 
		}
		super.onActivityResult(requestCode, resultCode, data);
	}

	@Override
	public void onClick(View view)
	{

		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		//Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("/sdcard/test.jpg")));
		ListView a;
		
		startActivityForResult(intent, 1);
		
	}

}

二、使用Camera对象

public class CameraPreview extends Activity
{

	private Preview preview;
	private ImageView ivFocus;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		preview = new Preview(this);
		setContentView(preview);

		ivFocus = new ImageView(this);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event)
	{
		if (event.getAction() == MotionEvent.ACTION_DOWN)
			preview.takePicture();
		return super.onTouchEvent(event);
	}

	class Preview extends SurfaceView implements SurfaceHolder.Callback
	{
		private SurfaceHolder holder;
		private Camera camera;
		// 创建一个PictureCallback对象,并实现其中的onPictureTaken方法
		private PictureCallback pictureCallback = new PictureCallback()
		{
			// 该方法用于处理拍摄后的照片数据
			public void onPictureTaken(byte[] data, Camera camera)
			{
				
				// data参数值就是照片数据,将这些数据以key-value形式保存,以便其他调用该Activity的程序可
				// 以获得照片数据
				getIntent().putExtra("bytes", data);
				setResult(20, getIntent());
				// 停止照片拍摄
				camera.stopPreview();
				camera = null;
				// 关闭当前的Activity
				finish();
			}
		};

		// Preview类的构造方法
		public Preview(Context context)
		{
			super(context);
			// 获得SurfaceHolder对象
			holder = getHolder();
			// 指定用于捕捉拍照事件的SurfaceHolder.Callback对象
			holder.addCallback(this);
			// 设置SurfaceHolder对象的类型
			holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	
		}

		// 开厹拍照时调用该方法
		public void surfaceCreated(SurfaceHolder holder)
		{
			// 获得Camera对象
			camera = Camera.open();
			try
			{
				
				// 设置用于显示拍照摄像的SurfaceHolder对象
				camera.setPreviewDisplay(holder);
			}
			catch (IOException exception)
			{
				// 释放手机摄像头
				camera.release();
				camera = null;
			}
		}

		// 停止拍照时调用该方法
		public void surfaceDestroyed(SurfaceHolder holder)
		{
			// 释放手机摄像头
			camera.release();
		}

		// 拍照状态变化时调用该方法
		public void surfaceChanged(final SurfaceHolder holder, int format,
				int w, int h)
		{
			try
			{
				Camera.Parameters parameters = camera.getParameters();
				// 设置照片格式
				parameters.setPictureFormat(PixelFormat.JPEG);
	
			
				// 根据屏幕方向设置预浏尺寸
				if (getWindowManager().getDefaultDisplay().getOrientation() == 0)
					parameters.setPreviewSize(h, w);
				else
					parameters.setPreviewSize(w, h);
				// 设置拍摄照片的实际分辨率,在本例中的分辨率是1024*768
				parameters.setPictureSize(1024, 768);
				// 设置保存的图像大小
				camera.setParameters(parameters);
				// 开始拍照
				camera.startPreview();
				// 准备用于表示对焦状态的图像(类似对焦符号)
				ivFocus.setImageResource(R.drawable.focus1);
				LayoutParams layoutParams = new LayoutParams(
						LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
				ivFocus.setScaleType(ScaleType.CENTER);
				addContentView(ivFocus, layoutParams);
				ivFocus.setVisibility(VISIBLE);
				// 自动对焦
				camera.autoFocus(new AutoFocusCallback()
				{
					public void onAutoFocus(boolean success, Camera camera)
					{
						if (success)
						{
							// success为true表示对焦成功,改变对焦状态图像(一个绿色的png图像)
							ivFocus.setImageResource(R.drawable.focus2);
						}
					}
				});
			}
			catch (Exception e)
			{
			}
		}

		// 停止拍照,并将拍摄的照片传入PictureCallback接口的onPictureTaken方法
		public void takePicture()
		{
			if (camera != null)
			{
				
				camera.takePicture(null, null, pictureCallback);
			}
		}
	}

}

public class Main extends Activity implements OnClickListener
{
	public ImageView imageView;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Button btnTakePicture = (Button) findViewById(R.id.btnTakePicture);
		btnTakePicture.setOnClickListener(this);
		imageView = (ImageView) findViewById(R.id.imageview);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		if (requestCode == 1)
		{
			if (resultCode == 20)
			{
				Bitmap cameraBitmap;
				byte[] bytes = data.getExtras().getByteArray("bytes");
				cameraBitmap = BitmapFactory.decodeByteArray(bytes, 0,
						bytes.length);
				if (getWindowManager().getDefaultDisplay().getOrientation() == 0)
				{
					Matrix matrix = new Matrix();
					matrix.setRotate(90);
					cameraBitmap = Bitmap.createBitmap(cameraBitmap, 0, 0,
							cameraBitmap.getWidth(), cameraBitmap.getHeight(),
							matrix, true);
				}
				File myCaptureFile = new File("/sdcard/camera.jpg");
				try
				{
					BufferedOutputStream bos = new BufferedOutputStream(
							new FileOutputStream(myCaptureFile));

					cameraBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
					bos.flush();
					bos.close();

					imageView.setImageBitmap(cameraBitmap);

				}
				catch (Exception e)
				{
				}
			}

		}
		super.onActivityResult(requestCode, resultCode, data);
	}

	public void onClick(View view)
	{
		Intent intent = new Intent(this, CameraPreview.class);
		startActivityForResult(intent, 1);

	}

}

最后,需要在mainfirst中添加使用camera的权限:

<uses-permission android:name="android.permission.CAMERA" />


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10099 0
树莓派 之 可用系统
可用系统 树莓派没有BIOS,所有未插卡接显示器不会有任何显示 因为树莓派有活跃的社区支持,使得可选系统很丰富,参照官网 桌面系统 OS 下载 附加信息 RASPBIAN JESSIE镜像;安装说明 官方系统,无论性能还是支持方面都很突出 Kali Linuxhttps://images.
1216 0
麻省理工学院开发系统 使用肌肉信号控制无人机
麻省理工学院的研究人员创造了一个新的系统,能让我们更接近于人与机器人的无缝协作。这套系统被称为 "行为-A-Bot"。它利用可穿戴式传感器发出的人体肌肉信号来驾驶无人机,控制无人机的运动。
390 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13896 0
捷信达酒店管理系统使用说明
捷信达酒店管理系统使用说明下载地址: 链接:https://pan.baidu.com/s/1VHNneqEmIB9yibZ0VSlWvA 密码:ilr7    网名:浩秦; 邮箱:root#landv.pw; 只要我能控制一個國家的貨幣發行,我不在乎誰制定法律。
1878 0
系统使用详解之传感器详解
本文讲解android中的传感器,这是智能手机中的一个重要组成方面。 我们首先来讲解一下android手机中对坐标的定义: X轴的方向是沿着屏幕水平方向从左向右,较短的边需要水平放置,较长的变需要垂直放置 Y轴的方向是从屏幕的左下角开始沿着屏幕的垂直方向指向屏幕的顶端 Z轴是将手机平放在桌子上,从手机里指向天空 传感器使用到一个values数组,他一般具有三个参数,参数的意义和传感器类型有关。
625 0
Linux 命令详解(四)使用 Nmon 监控 Linux 的系统性能
使用 Nmon 监控 Linux 的系统性能 http://mp.weixin.qq.com/s/fUgHwGjoWd5IQPjlnU6zFw
907 0
+关注
eclipse_xu
《Android群英传》作者
262
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载