private File tempFile;
private ImageView imgPhoto;
private static final int PHOTO_REQUEST_GALLERY = 1;
private static final int PHOTO_REQUEST_CAREMA = 2;
private static final int PHOTO_REQUEST_CUT = 3;
private String PHOTO_FILE_NAME="temp.jpg";
第一步,我们可以先激活系统图片或是相机来获取相片
/*
*
从相册获取
*/
public
void
gallery(View
view) {
//
激活系统图库,选择一张图片
Intent
intent =
new
Intent(Intent.ACTION_PICK);
intent.setType(
"image/*"
);
//
开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY
startActivityForResult(intent,
PHOTO_REQUEST_GALLERY);
}
/*
*
从相机获取
*/
public
void
camera(View
view) {
//
激活相机
Intent
intent =
new
Intent(
"android.media.action.IMAGE_CAPTURE"
);
//
判断存储卡是否可以用,可用进行存储
//
if
(hasSdcard())
{
tempFile
=
new
File(Environment.getExternalStorageDirectory(),
PHOTO_FILE_NAME);
//
从文件中创建uri
Uri
uri = Uri.fromFile(tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
uri);
//
}
//
开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA
startActivityForResult(intent,
PHOTO_REQUEST_CAREMA);
}
第二步,通过startActivityForResult()方法我们可以在onActivityResult()中来获取到相应的返回值
@Override
protected
void
onActivityResult(
int
requestCode,
int
resultCode,
Intent data) {
if
(requestCode
== PHOTO_REQUEST_GALLERY) {
//
从相册返回的数据
if
(data
!=
null
)
{
//
得到图片的全路径
Uri
uri = data.getData();
crop(uri);
}
}
else
if
(requestCode
== PHOTO_REQUEST_CAREMA) {
//
从相机返回的数据
//
if
(hasSdcard())
{
crop(Uri.fromFile(tempFile));
//
}
else
{
//
Toast.makeText(MainActivity.
this
,
"未找到存储卡,无法存储照片!"
,
0
).show();
//
}
}
else
if
(requestCode
== PHOTO_REQUEST_CUT) {
//
从剪切图片返回的数据
if
(data
!=
null
)
{
Bitmap
bitmap = data.getParcelableExtra(
"data"
);
this
.iv_image.setImageBitmap(bitmap);
}
try
{
//
将临时文件删除
tempFile.delete();
}
catch
(Exception
e) {
e.printStackTrace();
}
}
super
.onActivityResult(requestCode,
resultCode, data);
}
第三步,注意到里边有一个crop()方法,顾名思义,就是用于剪切图片的
/*
*
剪切图片
*/
private
void
crop(Uri
uri) {
//
裁剪图片意图
Intent
intent =
new
Intent(
"com.android.camera.action.CROP"
);
intent.setDataAndType(uri,
"image/*"
);
intent.putExtra(
"crop"
,
"true"
);
//
裁剪框的比例,1:1
intent.putExtra(
"aspectX"
,
1
);
intent.putExtra(
"aspectY"
,
1
);
//
裁剪后输出图片的尺寸大小
intent.putExtra(
"outputX"
,
250
);
intent.putExtra(
"outputY"
,
250
);
intent.putExtra(
"outputFormat"
,
"JPEG"
);
//
图片格式
intent.putExtra(
"noFaceDetection"
,
true
);
//
取消人脸识别
intent.putExtra(
"return-data"
,
true
);
//
开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
startActivityForResult(intent,
PHOTO_REQUEST_CUT);
}
第四步,在剪切完成图片后,切图应用就会将图片通过onActivityResult()返回给我们
通过Bitmap bitmap = data.getParcelableExtra("data");我们就拿到了我们想要的bitmap
由于上边的代码涉及到读写sdcard,所以要记得在清单文件中授权
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
></uses-permission>