Android解决部分机型获取不到系统拍照图片,图库图片问题的解决

来源:互联网 发布:淘宝宠物用品店铺介绍 编辑:程序博客网 时间:2024/05/01 18:06

1.前言

       现在的APP中,获取手机图片,或是拍照已经是必不可少的了,例如更好头像,还有就是类似QQ控件,或是朋友圈上传图片,视频等!但是Android由于各个手机厂商对系统都有不同的更改,以及Android4.4前后获取路径的差别,以至于在各个品牌的手机,以及各个Android系统之间需要适配,这个工作比较麻烦,这里是本人对各个品牌以及不同呢Android版本出现问题进行的总结之后抽出来的工具类,可以值以后的开发中直接使用,如果有测出什么品牌的手机有问题,可以联系我,我尽快优化解决没有适配的手机,谢谢。这里是打算实现视频所有手机的获取系统图片,视频,以及拍照的工具类,

2.实现思路

       这里是通过本人在开发中,遇到部分机型获取不到图库图片,或是拍照图片出问题的,主要有以下几个方面,代码都是实战原码,解决大部分机型的问题,如还有部分机型不能解决,请联系我,我将尽快完善,谢谢!

①拍照和摄像的时候,可以给他指定一个存放的路径,这样不管在任何手机中,我们只要获取到这个路径中的文件就可以了,所以也不需要管其他的问题,都可以获取到图片路径以及图片。

②在Android4.4前后返回来的Uri获取的路径一个是真实路径,一个不是真实路径,所以需要将Android4.4之后返回来的Uri转换成真实路径。

③在调用系统裁剪的时候,有可能会压缩图片,或是失真,这里也是给裁剪设置一个输出路径,一个不要设置图片格式为JPEG,这样很可能会出现失真现象。

④还有部分手机拍照之后,可能出现图片旋转,这是就需要将图片旋转回来再进行上传和显示。

⑤通过activityresult获取的图片有可能会被压缩,可以通过指定路径的Uri获取到原图。


3.实现代码

  /**
     * 获取图片,视频原文件的Uri
     * 设置保存图片,视频的路径,返回一个Uri
     * @return
     */
    public static Uri getFilePath(boolean isVideo) {
        Uri fileUri = null;
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断SD卡是否存在
            String filepath = Environment.getExternalStorageDirectory() + "/EvenTest/camera/";//用来存放图片视频路径
            File file = new File(filepath);
            if (!file.exists()) {
                file.mkdirs();
            }
            if (isVideo) {
                fileUri = Uri.fromFile(new File(file, "eventest.mp4"));
            } else
                fileUri = Uri.fromFile(new File(file, "eventest.png"));
            return fileUri;
        }
        return null;
    }

②判断是否需要旋转以及旋转角度

/**
     * 获取拍摄的文件有没有选择角度
     *
     * @param path
     * @return
     */
    public static int getFileDegree(String path) {


        int degree = 0;
        try {
            ExifInterface exifInterface = new ExifInterface(path);//获取指定路径的文件Exif信息
            int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);//获取图片旋转角度
            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                    degree = 90;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    degree = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    degree = 270;
                    break;
            }


        } catch (IOException e) {
            e.printStackTrace();
        }
        return degree;
    }


    /**
     * 将bitmap进行旋转相对应的角度
     *
     * @param bitmap
     * @param degree
     * @return
     */
    public static Bitmap getRotateBitmap(Bitmap bitmap, int degree) {
        //使用矩阵旋转角度
        Matrix matrix = new Matrix();
        matrix.postRotate(degree);
        //获取旋转后的图片
        Bitmap rtBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        if (rtBitmap == null) {
            rtBitmap = bitmap;
        }
        if (bitmap != null && bitmap != rtBitmap) {
            bitmap.recycle();
        }
        return rtBitmap;
    }

③获取Android4.4以上的路径

 /**
     * 解决在Android4.4以上获取路径的方法,通过Uri.getPath()获取的路径是有问题的
     *
     * @param contentURI
     * @return
     */
    public static String getRealPathFromURI(Context context, Uri contentURI) {
        String result;
        Cursor cursor = context.getContentResolver().query(contentURI, null, null, null, null);
        if (cursor == null) {
            // Source is Dropbox or other similar local file path
            result = contentURI.getPath();
        } else {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            result = cursor.getString(idx);
            cursor.close();
        }
        return result;
    }

4.项目demo:GitHub地址

0 0