调用摄像头拍照,剪裁(第一行代码8.3.2)

一、实际中的需求

很多应用程序可能会使用到调用摄像头的拍照功能,像程序里需要上传一张图片作为用户的头像。


二、实现步骤:

1.创建File对象,用于存储拍照后的照片;

2.调用Uri的fromFile()方法将File对象转换成Uri对象;

3.接着构建出一个Intent对象,并将这个Intent的action指定为Android.media.action.

4.再调用Intent 的putExtra()方法指定图片的输出地址,这里填入刚刚得到的Uri 对象;

5.启动照相机;调用startActivityForResult()来启动活动

6.注意刚才我们是使用startActivityForResult()来启动活动的,因此拍完照后会有结果返回到onActivityResult()方法中;

7.如果发现拍照成功,则会再次构建出一个Intent 对象,并把它的action 指定为com.android.camera.action.CROP.

8.然后给这个Intent 设置上一些必要的属性,并再次调用startActivityForResult()来启动裁剪程序。裁剪后的照片同样会输出到output_image.jpg 中

9.裁剪操作完成之后,程序又会回调到onActivityResult()方法中.

10.调用BitmapFactory 的decodeStream()方法将output_image.jpg 这张照片解析成Bitmap 对象.

11.将剪裁后的照片显示出来,设置到ImageView 中显示出来

更详细解释参考博文:http://blog.csdn.net/xiaoliizi/article/details/50723650



三、实现代码

1.MainActivity

package com.zhc.choosepictest;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class MainActivity extends Activity {

	protected static final int TAKE_PHOTO = 1;
	private static final int GROP_PHOTO = 2;
	private Button takePhoto;
	private ImageView picture;
	private Uri imagrUri;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		takePhoto = (Button) findViewById(R.id.take_photo);
		picture = (ImageView) findViewById(R.id.picture);

		takePhoto.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// 1.创建File对象,用于存储拍照后的照片
				File outputImage = new File(Environment
						.getExternalStorageDirectory(), "output_image.jpg");

				try {
					if (outputImage.exists()) {
						outputImage.delete();
					}
					outputImage.createNewFile();
				} catch (IOException e) {
					e.printStackTrace();
				}
				
				 //2.调用Uri的fromFile()方法将File对象转换成Uri对象
				imagrUri = Uri.fromFile(outputImage);
				
				//3.接着构建出一个Intent对象,并将这个Intent的action指定为Android.media.action.
				Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
				
				//4.再调用Intent 的putExtra()方法指定图片的输出地址,这里填入刚刚得到的Uri 对象
				intent.putExtra(MediaStore.EXTRA_OUTPUT, imagrUri);
				
				// 5.启动照相机;调用startActivityForResult()来启动活动
				startActivityForResult(intent, TAKE_PHOTO); 

			}
		});
	}

	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		//6.注意刚才我们是使用startActivityForResult()来启动活动的,因此拍完照后会有结果返回到onActivityResult()方法中
		//9.裁剪操作完成之后,程序又会回调到onActivityResult()方法中.
		
		switch (requestCode) {
		case TAKE_PHOTO:
			if (resultCode == RESULT_OK) {
				//7.如果发现拍照成功,则会再次构建出一个Intent 对象,并把它的action 指定为com.android.camera.action.CROP.
				Intent intent = new Intent("com.android.camera.action.CROP");
				
				//8.然后给这个Intent 设置上一些必要的属性,并再次调用startActivityForResult()来启动裁剪程序。裁剪后的照片同样会输出到output_image.jpg 中
				intent.setDataAndType(imagrUri, "image/**");
				intent.putExtra("scale", true);
				intent.putExtra(MediaStore.EXTRA_OUTPUT, imagrUri);
				startActivityForResult(intent, GROP_PHOTO);	// 启动剪裁程序
				
			
			}
			break;
		case GROP_PHOTO:
			if (resultCode == RESULT_OK) {
				try {
					//10.调用BitmapFactory 的decodeStream()方法将output_image.jpg 这张照片解析成Bitmap 对象.
					Bitmap bitmap = BitmapFactory
							.decodeStream(getContentResolver().openInputStream(
									imagrUri));
					
					// 11.将剪裁后的照片显示出来,设置到ImageView 中显示出来
					picture.setImageBitmap(bitmap);
					
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				}
			}
			break;
		default:
			break;
		}
	}

}

2.activiity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/take_photo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="拍照" />

    <ImageView
        android:id="@+id/picture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

</LinearLayout>

3.清单文件中添加权限

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

四、结果与遇到问题

1.

    


2.遇到问题

1》图片应该是保存在SD卡下,但是没找到。

2》在剪裁完之后保存时,有时会提示“无法保存经过剪裁的图片”。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值