Zmj_Dns 2018-09-29 02:48 采纳率: 0%
浏览 1392

小米手机第一拍照完无法调用裁剪程序的问题

红米手机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);
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 求差集那个函数有问题,有无佬可以解决
    • ¥15 【提问】基于Invest的水源涵养
    • ¥20 微信网友居然可以通过vx号找到我绑的手机号
    • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
    • ¥15 解riccati方程组
    • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
    • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
    • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
    • ¥50 树莓派安卓APK系统签名
    • ¥65 汇编语言除法溢出问题