android拍照实现过程图,Android 拍照或者从相册获取图片的实现

我们常常会用到上传头像,或者发帖子的时候选择本地图片上传的功能.这个很常见

今天因为app的需求我研究了下.现在分享下.

其实不论是通过拍照还是从相册选取都会用到Intent

这是系统提供给我们用来调用系统方法的好用工具!

首先,需要设计下我们想怎么调用系统的拍照或者选取图片的方法

我们可以点击头像或者一个按钮然后弹出一个对话框,让用户自己

选择是拍照还是选择图片(如下图)

.

6b00ae2d96b5d6dba404fdb05e7a72b9.png

那这个对话框怎么写呢.通过AlertDialog来实现(我们就给这个方法起名叫dialog):

//对头像操作

private voiddialog() {

AlertDialog.Builder builder= new AlertDialog.Builder(MainActivity.this);

builder.setTitle("提示");

builder.setMessage("请选择修改头像方式");//调用相机拍照

builder.setPositiveButton("拍照", newDialogInterface.OnClickListener() {

@Overridepublic void onClick(DialogInterface dialogInterface, inti) {

takePhoto();

}

});//从相册里面取照片

builder.setNegativeButton("相册", newDialogInterface.OnClickListener() {

@Overridepublic void onClick(DialogInterface dialogInterface, inti) {

pickPhoto();

}

});

builder.create().show();

}

然后就要实现拍照和相册选择功能(通过intent):

/*** 拍照获取图片*/

private voidtakePhoto() {//执行拍照前,应该先判断SD卡是否存在

String SDState =Environment.getExternalStorageState();if(SDState.equals(Environment.MEDIA_MOUNTED)) {

Intent intent= new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//"android.media.action.IMAGE_CAPTURE"

/***

* 需要说明一下,以下操作使用照相机拍照,拍照后的图片会存放在相册中的

* 这里使用的这种方式有一个好处就是获取的图片是拍照后的原图

* 如果不实用ContentValues存放照片路径的话,拍照后获取的图片为缩略图不清晰*/ContentValues values= newContentValues();

photoUri= this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);//intent.putExtra("uri" , photoUri);

/**-----------------*/startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO);

}else{

Toast.makeText(this, "内存卡不存在", Toast.LENGTH_LONG).show();

}

}/***

* 从相册中取图片*/

private voidpickPhoto() {//AndroidImagePicker.getInstance().setSelectMode(AndroidImagePicker.Select_Mode.MODE_MULTI);

Intent intent = new Intent(Intent.ACTION_PICK, null);//通过Intent 筛选所有的图片

intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");

startActivityForResult(intent, REQ_IMAGE);

}

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);调用系统拍照的功能

通过重写onActivityResult的方法获取通过

startActivityForResult()传来的信息(主要是拍照图片的uri).

获取该uri:

Uri uri = data.getData();

获取了uri后就可以给相应的控件设置背景.比如(是给页面设置背景):

bt = MediaStore.Images.Media.getBitmap(this.getContentResolver() , uri);

im.setImageBitmap(bt);

bt是Bitmap类型im是ImageView类型并且已经绑定控件.

在startActivityForResult()的参数中包含了(Intent data 改参数主要存放选中或者拍照的uri)

Intent intent = new Intent(Intent.ACTION_PICK, null);

intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");

这两句就是调用系统图片选择的方法.同样通过 startActivityForResult()传递参数

startActivityForResult(Intent , int)

这个方法与onActivityResult()配套使用

它的第一个参数用来传递intetn信息 , 第二个参数是自己定义的常量用来唯一标识他的intent

onActivityResult()的第二个参数即是这个唯一标识.第三个参数是intent信息.

@Overrideprotected void onActivityResult(int requestCode, intresultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == Activity.RESULT_OK && requestCode ==SELECT_PIC_BY_TACK_PHOTO) {

String[] pojo={MediaStore.Images.Media.DATA, MediaStore.Images.Media.TITLE, MediaStore.Images.Media.SIZE};

Cursor cursor= getContentResolver().query(photoUri, pojo, null, null, null);if (cursor != null) {

cursor.moveToFirst();

String picpath= cursor.getString(cursor.getColumnIndexOrThrow(pojo[0]));

ImageItem item= newImageItem(

picpath

, cursor.getString(cursor.getColumnIndexOrThrow(pojo[1]))

, cursor.getInt(cursor.getColumnIndexOrThrow(pojo[2])));if (picpath != null &&(picpath.endsWith(".png") || picpath.endsWith(".PNG") || picpath.endsWith(".jpg"))) {

File file= newFile(picpath);

Bitmap bt=BitmapFactory.decodeFile(picpath);

mText1.setText(picpath);

bt=getimage(picpath);

im.setImageBitmap(bt);

}else{

Toast.makeText(this, "选择图片文件不正确", Toast.LENGTH_LONG).show();

}

cursor.close();

}

}else{

Bitmap bt= null;try{

Uri uri=data.getData();

mText1.setText(uri.toString());

bt= MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);

im.setImageBitmap(bt);

}catch(IOException e) {

e.printStackTrace();

}

}

}

就是这些.关于onActivityResult()的具体参数信息可以自行查文档或者百度.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值