• 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)
    }

  • 相关阅读:
    视频知识点(17)- flv.js 实现播放本地视频文件的技巧
    无线传感器网络基于MCKP-MMF算法的流量估计matlab仿真
    使用vnc远程centos桌面
    自动驾驶仿真模型搭建
    npm,yarn如何查看源和换源,删除node_modules
    正点原子嵌入式linux驱动开发——RGB转HDMI
    使用sqlcipher打开加密的sqlite方法
    100天精通Python——第47天:selenium自动化操作浏览器
    在STS里使用Gradle编译Apache POI5.0.0
    SAP 生产成本明细报表
  • 原文地址:https://blog.csdn.net/szdenny/article/details/134372092