定义2个常量,分别代表拍照和本地上传
private static final int IMAGE_REQUEST_CODE = 0;
private static final int CAMERA_REQUEST_CODE = 1;
private static final int RESULT_REQUEST_CODE = 2;
定义一个全局变量
private Uri imageUri;
拍照代码
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date(System.currentTimeMillis());
String filename = format.format(date);
//创建File对象用于存储拍照的图片 SD卡根目录
//File outputImage = new File(Environment.getExternalStorageDirectory(),test.jpg);
//存储至DCIM文件夹
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File outputImage = new File(path, filename + ".png");
try {
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//将File对象转换为Uri并启动照相程序
Intent intentCamera;
if (Build.VERSION.SDK_INT >= 23) {
//将File对象转换为Uri并启动照相程序
//imageUri = Uri.fromFile(outputImage);
imageUri = FileProvider.getUriForFile(context, "com.com.suchbear.fileprovider", outputImage);
intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
} else {
//将File对象转换为Uri并启动照相程序
imageUri = Uri.fromFile(outputImage);
intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
}
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
// intentCamera.putExtra("return-data", true);
startActivityForResult(intentCamera, CAMERA_REQUEST_CODE);
获取本地图片代码
Intent intentFromCapture = new Intent(Intent.ACTION_PICK);
// 判断存储卡是否可以用,可用进行存储
intentFromCapture.setType("image/*");
startActivityForResult(intentFromCapture,
IMAGE_REQUEST_CODE);
接着在onActivityResult方法中处理回调
if (resultCode != RESULT_CANCELED) {
switch (requestCode) {
case IMAGE_REQUEST_CODE:
startPhotoZoom(data.getData());
break;
case CAMERA_REQUEST_CODE:
// 判断存储卡是否可以用,可用进行存储
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
startPhotoZoom(imageUri);
} else {
Util.toastMsg("未找到存储卡,无法存储照片!");
}
break;
case RESULT_REQUEST_CODE: // 图片缩放完成后
if (data != null) {
getImageToView(data);
}
break;
}
}
startPhotoZoom方法为系统自带裁剪工具
/**
* 裁剪图片方法实现
*
* @param uri
*/
public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
if (Build.VERSION.SDK_INT >= 23) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
intent.setDataAndType(uri, "image/*");
// 设置裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 200);
intent.putExtra("outputY", 200);
intent.putExtra("return-data", true);
startActivityForResult(intent, RESULT_REQUEST_CODE);
}
getImageToView方法是获取图片后的相关处理
/**
* 保存裁剪之后的图片数据
*/
private void getImageToView(Intent data) {
Bundle extras = data.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
//文件流
/*File file = new File("/sdcard/DCIM/Camera/tempHeader.png");
if (file.exists()) {
file.delete();
}
FileOutputStream out;
try {
out = new FileOutputStream(file);
if (photo.compress(Bitmap.CompressFormat.PNG, 90, out)) {
out.flush();
out.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}*/
}
}