华为、小米图片上传裁剪失败问题

news/2024/11/7 1:41:01/

首先分析原因:裁剪时 return-data的方式只适用于小图,小米miui系统和华为系统默认的裁剪图片可能裁剪得过大,或对return-data分配的资源不足,造成return-data失败。

解决方法:裁剪后,将裁剪的图片保存在Uri中,在onActivityResult()方法中,再提取对应的Uri图片转换为Bitmap使用。

//拍照获取图片
private void takePhoto() {
    Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    // 判断存储卡是否可用,存储照片文件
    if (hasSdcard()) {ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, IMAGE_FILE_NAME);
        intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), IMAGE_FILE_NAME)));
    }startActivityForResult(intentFromCapture, CODE_CAMERA_REQUEST);
}

//从相册选取图片
private void selectPhotoFromGallery() {Intent intentFromGallery = new Intent();
    // 设置文件类型
    intentFromGallery.setType("image/*");
    intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(intentFromGallery, CODE_GALLERY_REQUEST);

/**
     * 裁剪原始的图片
     */
    public void cropRawPhoto(Uri uri) {

        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");

        // 设置裁剪
        intent.putExtra("crop", "true");

        // aspectX , aspectY :宽高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);

        // outputX , outputY : 裁剪图片宽高
        intent.putExtra("outputX", output_X);
        intent.putExtra("outputY", output_Y);
//        intent.putExtra("return-data", true);      //原本的裁剪方式

        //uritempFile为Uri类变量,实例化uritempFile,转化为uri方式解决问题
        mUritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mUritempFile);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

        startActivityForResult(intent, CODE_RESULT_REQUEST);
    }

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {super.onActivityResult(requestCode, resultCode, intent);
        // 用户没有进行有效的设置操作,返回
        if (resultCode == getActivity().RESULT_CANCELED) {return;
        }switch (requestCode) {case CODE_GALLERY_REQUEST:      //相册
                String replace = intent.getData().toString().replace("content", "file");
                cropRawPhoto(Uri.parse(replace));
                break;

            case CODE_CAMERA_REQUEST:       //相机
                if (hasSdcard()) {
                    File tempFile = new File(Environment.getExternalStorageDirectory(), IMAGE_FILE_NAME);
                    Log.e("ffl", "onActivityResult: path==== " + tempFile.getAbsolutePath());
                    cropRawPhoto(Uri.fromFile(tempFile));
                } else {Toast.makeText(getActivity(), "没有SDCard!", Toast.LENGTH_LONG).show();
                }break;

            case CODE_RESULT_REQUEST:

                if (intent != null) {
                    //将Uri图片转换为Bitmap
                    try {Bitmap bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(mUritempFile));
                        //TODO,将裁剪的bitmap显示在imageview控件上

                        setImageToHeadView(bitmap);
                    } catch (FileNotFoundException e) {e.printStackTrace();
                    }
//                    setImageToHeadView(intent);
                }else {Log.e("ffl", "onActivityResult: -------------intent为null------------");
                }break;
        }}


但是小米手机选择相册时,如果不使用系统截屏,可以使用,但是如果截屏就会报“保存时发生错误,保存失败”

这时我们需要做一个转换,把URI地址转为图片地址,再包成file文件转为URI,就可以使用了,代码如下:


  1. Uri uri = intent.getData();  
  2.        String type = intent.getType();  
  3.        if (uri.toString().contains("com.miui.gallery.open")) {  
  4.            uri = getImageContentUri(activity, new File(getRealFilePath(activity, uri)));  
  5.        }  

  1. /**  
  2.     * 将URI转为图片的路径  
  3.     *  
  4.     * @param context  
  5.     * @param uri  
  6.     * @return  
  7.     */  
  8.    public static String getRealFilePath(final Context context, final Uri uri) {  
  9.        if (null == uri)  
  10.            return null;  
  11.        final String scheme = uri.getScheme();  
  12.        String data = null;  
  13.        if (scheme == null)  
  14.            data = uri.getPath();  
  15.        else if (ContentResolver.SCHEME_FILE.equals(scheme)) {  
  16.            data = uri.getPath();  
  17.        } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {  
  18.            Cursor cursor = context.getContentResolver().query(uri,  
  19.                    new String[]{ImageColumns.DATA}, null, null, null);  
  20.            if (null != cursor) {  
  21.                if (cursor.moveToFirst()) {  
  22.                    int index = cursor.getColumnIndex(ImageColumns.DATA);  
  23.                    if (index > -1) {  
  24.                        data = cursor.getString(index);  
  25.                    }  
  26.                }  
  27.                cursor.close();  
  28.            }  
  29.        }  
  30.        return data;  
  31.    } 

    1. /**  
    2.     *
    3.     *  包成file文件转为URI
    4.     *
    5.     */  

  32. public static Uri getImageContentUri(Context context, File imageFile) {  
  33.         String filePath = imageFile.getAbsolutePath();  
  34.         Cursor cursor = context.getContentResolver().query(  
  35.                 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  
  36.                 new String[]{MediaStore.Images.Media._ID},  
  37.                 MediaStore.Images.Media.DATA + "=? ",  
  38.                 new String[]{filePath}, null);  
  39.   
  40.         if (cursor != null && cursor.moveToFirst()) {  
  41.             int id = cursor.getInt(cursor  
  42.                     .getColumnIndex(MediaStore.MediaColumns._ID));  
  43.             Uri baseUri = Uri.parse("content://media/external/images/media");  
  44.             return Uri.withAppendedPath(baseUri, "" + id);  
  45.         } else {  
  46.             if (imageFile.exists()) {  
  47.                 ContentValues values = new ContentValues();  
  48.                 values.put(MediaStore.Images.Media.DATA, filePath);  
  49.                 return context.getContentResolver().insert(  
  50.                         MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);  
  51.             } else {  
  52.                 return null;  
  53.             }  
  54.         }  
  55.     }  

http://www.ppmy.cn/news/232210.html

相关文章

Ionic3 Cordova Android 6.x集成最新极光华为/小米厂商点击通知跳转实现

Ionic3 Cordova Android 6.x集成最新极光华为/小米厂商点击通知跳转实现 一、添加跳转处理页面OpenClickActivity二、MainActivity获取传递参数三、JPushPlugin.java提供Java调用Js接口四、JPushPlugin.js提供接口供JPushPlugin.java调用五、在web项目app.page.ts中添加监听供J…

华为手机怎么刷android系统,怎样刷入安卓原生系统 在手机系统更新这件事上,小米华为和OPPOvivo谁更有良心...

原标题:在手机系统更新这件事上,小米华为和OPPOvivo谁更有良心? 用国产手机的朋友可能都有一种感受,对于系统升级这块,有的厂商很积极,但有的厂商却非常的不积极。比如小米,华为,一加等在系统升级方面就很快。而OPPO和vivo在系统升级这块就比较慢。而有意思的是,前者因…

小米8探索版android版本,小米8透明探索版三个月使用体验

小米8透明探索版三个月使用体验 2019-01-21 14:02:18 2点赞 2收藏 5评论 购买理由 在张大妈上面潜水了两三年了,薅到很多羊毛,这是第一次发声,想了半天决定写写18年九月份入手的小米8透明探索版吧。 之前一直是使用苹果机,从iPhon…

Ionic3 Cordova Android 6.x集成最新极光华为/小米厂商通道推送

Ionic3 Cordova Android 6.x集成最新极光华为/小米厂商推送 前置一、集成华为厂商推送1.在开放平台创建并配置应用2.在安卓项目配置SDK2.1. 添加配置文件2.2. 配置build.gradle集成sdk和插件2.2.1. 打开app目录下的build.gradle文件2.2.2. 添加HUAWEI agcp插件以及Maven代码库2…

华为小米等折叠屏适配研究

市面上折叠屏陆续出了几款手机,我们产品也下发了适配折叠屏的需求,以下对折叠屏是撇工作做一个记录,中间也包含网络搜罗资料整理,供大家参考。 一、目前主流折叠屏机型: 厂商 型号折叠分辨率展开分辨率华为HUAWEI Ma…

2021 App上架到 各应用商店(应用宝,华为,vivo,小米,AppStore)

操作目录 一. 需要准备材料1.软件安装包【apk/ipa】2.软件包名/PackageName3. 软著4.营业执照5.软件隐私协议 & 软件用户服务协议6.App图标7.应用截图8. 企业法定代表人身份证正背面9. 电子版权证书10. App简介11. ICP备案号 & 域名 二. 各应用商店网址1. 应用宝2. 小米…

android 小米相册无法获取,适配小米华为手机等拍照后获取不到照片

问题摘要:适配小米华为手机等拍照后获取不到照片 出现场景 普通的相机调用,在 intent 传进去一个路径,然调用这个意图。 在测试机 荣耀 8x 上是没有问题的,能获取到拍的照片。 在小米系统和 华为麦芒4上就不行,路径上就没有照片。 /** * @param file 拍照生成的照片地址 *…

友盟推送集成小米华为通道

在集成友盟推送的时候,小米和华为对后台进程做了诸多限制。若使用一键清理,应用的channel进程被清除,将接收不到推送。为了增加推送的送达率,可选择接入小米托管弹窗功能。通知将由小米系统托管弹出,点击通知栏将跳转到…