• android MediaStore.ACTION_IMAGE_CAPTURE 调用照相机返回图片太小问题解决方法


    问题描述:

    val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    activity.startActivityForResult(intent,100)

    调用上面的方法,照相成功之后返回的图片只有300多像素,是被压缩过的,我们需要获取原始图片。

    改进如下:

    1、启动照相机之前,增加MediaStore.EXTRA_OUTPUT参数配置:

     val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
     intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri())
     activity.startActivityForResult(intent,100)

    2、getImageUri的实现如下:

    public static Uri getImageUri()
    {
        File outFile = new File(context.getExternalCacheDir().getPath(), "image_test.png");
        Uri contentUri = FileProvider.getUriForFile(
                context,
                context.getPackageName() + ".ImageFileProvider",
                outFile
        );
        return contentUri;
    }

    3、定义ImageFileProvider

    
        
    

    4、依赖的xml文件,创建file_paths.xml到res的xml目录

    
    
        
        
        
        
        
    
    

    5、UI那边实现这个方法

    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if (resultCode != Activity.RESULT_OK) {
        return;
    }
    try {
        Uri uri = getImageUri();
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
        InputStream inputStream = context.getContentResolver().openInputStream(uri);
        //获取旋转角度
        float photoRotation = getPhotoRotation(inputStream);
        //得到旋转后的图片
       Bitmap photoRotationBitmap = rotate(bitmap, photoRotation);
       //根据业务逻辑来处理这个photoRotationBitmap 
    

            //todo

    } catch (Exception e) {
        e.printStackTrace();
    }
    }

    6、getPhotoRotation定义如下:

    fun getPhotoRotation(inputStream: InputStream): Float {
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                val exifInterface = ExifInterface(inputStream)
                val orientation = exifInterface.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_NORMAL
                )
                return when (orientation) {
                    ExifInterface.ORIENTATION_ROTATE_90 -> 90f
                    ExifInterface.ORIENTATION_ROTATE_180 -> 180f
                    ExifInterface.ORIENTATION_ROTATE_270 -> 270f
                    else -> 0f
                }
            }
        } catch (e: java.lang.Exception) {
            LogUtil.e(">>>>>>>>>>>>", "获取图片旋转的角度报错:" + e.message)
        }
        return 0f
    }

    7、rotate方法定义如下:

    fun rotate(rawBitmap: Bitmap, degree: Float): Bitmap {
        val matrix = Matrix()
        matrix.postRotate(degree)
        return Bitmap.createBitmap(rawBitmap, 0, 0, rawBitmap.width, rawBitmap.height, matrix, true)
    }

  • 相关阅读:
    php的错误机制
    最新Centos7 公网搭建Rocketmq以及踩坑指南
    企业级自定义表单引擎解决方案(十一)--表单规则引擎1
    Android AMS ATMS
    unittest单元测试框架使用
    客户端实现client.go客户端类型定义连接
    机器学习评估指标(Metrics)
    关于车载毫米波雷达(是否被)遮挡问题的讨论
    Metasploit——后渗透测试阶段
    后端工程师之路(1)数据库部分
  • 原文地址:https://blog.csdn.net/szdenny/article/details/134372092