在开发中我们经常会用到相机或者从相册中选择图片上传,或者设置头像.
由于系统版本问题,高版本的系统拍照和相册会出现兼容性,读写文件的问题
都是程序猿,就不废话了,直接撸代码;
一,兼容android 7.0 在AndroidManifest.xml中先申请临时访问权限,样式和activity同级
二,申请权限,
三,权限要动态监测
1,可使用google提供的权限库easypermissions动态权限库:https://github.com/googlesamples/easypermissions
详细用法自行百度,google
private Uri photoOutputUri = FileProvider7.getUriForFile(this, new File(mImagePath));
/**
* 打开相机
*/
private void openCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
//拍照图片保存到指定的路径
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoOutputUri);
startActivityForResult(intent, 2);
}
/**
* 打开相册
*/
private void openPhoto() {
//调用android的图库
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, 3);
}
/**
* 兼容android 7.0以上获取uri异常的工具类
*/
public class FileProvider7 {
/**
* 获取uri
* @param context
* @param file
*
* @return
*/
public static Uri getUriForFile(Context context, File file) {
Uri fileUri = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
fileUri = getUriForFile24(context, file);
} else {
fileUri = Uri.fromFile(file);
}
return fileUri;
}
/**
* android 7.0以上获取uri的方法
* @param context
* @param file
*
* @return
*/
private static Uri getUriForFile24(Context context, File file) {
Uri fileUri = FileProvider.getUriForFile(context,BuildConfig.APPLICATION_ID + ".fileProvider",
file);
return fileUri;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
//拍照完成,去裁剪
case 2:
startPhotoZoom(photoOutputUri, 150);
break;
//相册完成,去裁剪
case 3:
if (null != data) {
startPhotoZoom(data.getData(), 150);
}
break;
//裁剪完成,保存,上传
case 4:
mHandler.sendEmptyMessageDelayed(UPDATA_MSG, 200);
break;
default:
break;
}
}
}
/**
* 调用系统裁剪
*
* @param uri
* @param size
*/
private void startPhotoZoom(Uri uri, int size) {
Intent intent = new Intent("com.android.camera.action.CROP");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
//裁剪后输出路径
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mImagePath)));
//输入图片路径
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", size);
intent.putExtra("outputY", size);
intent.putExtra("scale", true);
intent.putExtra("scaleUpIfNeeded", true);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("return-data", false);
startActivityForResult(intent, 4);
}
裁剪成功后就可以进行设置,上传等操作了...通过uri可以拿到原始图片.
笔记备忘, 请多指教