红米手机Android6.0、小米手机6Android8.0系统,在第一次拍照完无法调用裁剪方法,流程是这样的:
这是一个设置头像的方法,通过拍照或者从相册选图片
第一种情况:点击拍照,拍照完点击对号,直接返回原来界面;
第二种情况:从相册选择图片,能正常剪切,能设置头像,
但是万万没想到,然后在次更换头像点击拍照就不会出现第一种情况的问题。
下面是代码:
public void showChoosePicDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("设置头像");
String[] items = { "选择本地照片", "拍照" };
builder.setNegativeButton("取消", null);
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case CHOOSE_PICTURE: // 选择本地照片
choseFile();
break;
case TAKE_PICTURE: // 拍照
onTackPhoto();
break;
}
}
});
builder.create().show();
}
private void choseFile(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(Const.PERMISSION_STORAGE, CHOOSE_PICTURE);
return;
}
}
// Intent openAlbumIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);
openAlbumIntent.setType("image/*");
startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);
}
private void onTackPhoto(){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if (ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
||ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
if (ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA},TAKE_PICTURE);
}else {
requestPermissions(new String[]{Manifest.permission.CAMERA},TAKE_PICTURE);
}
return;
}
}
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
final File pic = new File(path + "image.jpg");
if(pic.exists()){
pic.delete();
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
tempUri = FileProvider.getUriForFile(getActivity(),"com.XXXX.fileprovider",pic);
openCameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}else {
tempUri = Uri.fromFile(pic);
}
// tempUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "image.jpg"));
// 指定照片保存路径(SD卡),image.jpg为一个临时文件,每次拍照后这个图片都会被替换
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
startActivityForResult(openCameraIntent, TAKE_PICTURE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode,resultCode,data);
if (resultCode != FragmentActivity.RESULT_OK){
return;
}
switch (requestCode) {
case TAKE_PICTURE:
try{
ImageUtils.addPhotoToGallary(getActivity(),tempUri);
startPhotoZoom(tempUri); // 开始对图片进行裁剪处理
}catch (Exception e){
e.printStackTrace();
}
break;
case CHOOSE_PICTURE:
Uri imageUriSel = data.getData();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
//相册会返回一个由相册安全策略定义的Uri,app使用这个Uri直接放入裁剪程序会不识别,抛出[暂不支持此类型:华为7.0]
//formatUri会返回根据Uri解析出的真实路径
String imagePathSel = ImageUtils.getPath(getActivity(),imageUriSel);
//根据真实路径转化成File,然后通过FileProvider重新安全化再放入裁剪程序才可识别
imageUriSel = FileProvider.getUriForFile(getActivity(),"comXXXX.fileprovider",new File(imagePathSel));
//裁剪
startPhotoZoom(imageUriSel);
}else {
startPhotoZoom(imageUriSel);
}
break;
case CROP_SMALL_PICTURE:
File file = new File(destHeadUri.getPath());
Bitmap bitmap = BitmapFactory.decodeFile(destHeadUri.getPath());
bitmap = ImageUtils.toRoundBitmap(bitmap);
personImg.setImageBitmap(bitmap);
uploadPic(null);
break;
default:
break;
}
}
//裁剪
protected void startPhotoZoom(Uri uri) {
if (uri == null) {
Log.i("tag", "The uri is not exist.");
return;
}
tempUri = uri;
//创建文件
File cropPhotoFile = null;
try{
cropPhotoFile = ImageUtils.createCropImageFile(getActivity(),phone);
}catch (IOException e){
e.printStackTrace();
UseFileSingleton.appendStringToFileWithTimestamp(getActivity(),"创建目标头像准备剪切",e);
}
Intent intent = new Intent("com.android.camera.action.CROP");
//7.0 安全机制下不允许保存裁剪后的图片
//所以仅仅将File Uri传入MediaStore.EXTRA_OUTPUT来保存裁剪后的图像
//destHeadUri = Uri.fromFile(cropPhotoFile);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
//destHeadUri = FileProvider.getUriForFile(getActivity(),"com.XXXX.fileprovider",cropPhotoFile);
destHeadUri = Uri.fromFile(cropPhotoFile);
}else {
destHeadUri = Uri.fromFile(cropPhotoFile);
}
intent.setDataAndType(uri, "image/*");
// 设置裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT,destHeadUri);//输出目标headPhoto destHeadUri
startActivityForResult(intent, CROP_SMALL_PICTURE);
}