android调用拍照后存相册旋转问题和拍照后相册不显示问题

有个上传头像的功能  涉及到拍照  裁剪  相册选择  这几个功能   然后就是一步一个坎。。。。

第一个问题  拍照后相册查找不到  不显示 系统相册都没有  有的手机需要重启之后才会显示

这个问题的原因就是拍照之后要通知系统刷新相册才能显示  在你想要更新相册的地方   发一个广播

  /**
     * 通过file来通知系统相册更新   拍照后调用
     *
     * @param context
     * @param file 拍照保存图片的文件
     */
    public static void sendImageBroadcast(Context context, File file) {
        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        Uri contentUri = Uri.fromFile(file);
        intent.setData(contentUri);
        context.sendBroadcast(intent);
    }

然后就可以显示了  有些朋友可能还用的是另一种方法  

        MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, "", "");

这两种方法同时使用的话  会导致一个问题  就是你的同一张图片  在手机里保存了两次  第二个是向系统相册插入你的图片   如果你是想把图片保存到指定的相册的话   就不需要第二个方法了   

然后我就美滋滋的把这个保存方法也用到剪切之后了  但是我发现我太年轻了 。。。剪切之后  发送这个广播  不起作用。。。。

裁剪之后的图片保存不上去

剪切之后的图片保存  需要调用一个保存方法  然后以另一种方式发送一个广播  

下面是保存图片方法


    /**
     * 保存剪切后的图片
     *
     * @param name
     * @param bmp
     * @return
     */
    public static String saveImage(String name, Bitmap bmp) {
        File appDir = new File(Environment.getExternalStorageDirectory().getPath() + "/你的相册名");
        if (!appDir.exists()) {
            appDir.mkdir();
        }
        String fileName = name + ".jpg";
        File file = new File(appDir, fileName);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.flush();
            fos.close();
            return file.getAbsolutePath();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

然后是通过Uri来发送广播  就可以了

 /**
     * 通过Uri来通知系统相册更新   剪切后调用
     *
     * @param context
     * @param uri
     */
    public static void sendImageBroadcastUri(Context context, Uri uri) {
//        MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, "", "");

        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        intent.setData(uri);
        context.sendBroadcast(intent);
    }

然后我就美滋滋的跑了起来。。。但是我又年轻了。。。。whf   拍照后的图片是 歪的  旋转了90度  

第二个 拍照后保存图片被旋转了90度

这个是因为手机竖屏拍照的问题  我发现去系统相册查看  就是正常的   我最开始是想可能是我查看图片姿势不对  然后就在查看的时候查看图片是否有旋转  如果有  给他掰正喽   用的是下面的方法  方法行得通  实现了    但是在查看图片的时候会有延迟  体验很不好  下面是代码  有需要的可以用一下

 /**
     * 读取照片旋转角度
     *
     * @param path 照片路径
     * @return 角度
     */
    public static int readPictureDegree(String path) {
        int degree = 0;
        try {
            ExifInterface exifInterface = new ExifInterface(path);
            int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
            Log.e("TAG", "原图被旋转角度: ========== " + orientation);
            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;
    }


    /**
     * 旋转图片
     *
     * @param angle  被旋转角度
     * @param bitmap 图片对象
     * @return 旋转后的图片
     */
    public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
        Bitmap returnBm = null;
        // 根据旋转角度,生成旋转矩阵
        Matrix matrix = new Matrix();
        matrix.postRotate(angle);
        try {
            // 将原始图片按照旋转矩阵进行旋转,并得到新的图片
            returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        } catch (OutOfMemoryError e) {
        }
        if (returnBm == null) {
            returnBm = bitmap;
        }
        if (bitmap != returnBm) {
            bitmap.recycle();
        }
        return returnBm;
    }

然后我又想啊 (我能够感觉到发根松动了  头发再晃动)  应该在保存的时候就给他掰正了  再保存进去  

扫描二维码关注公众号,回复: 10288537 查看本文章

就在拍照回调的地方做了个判断  就可以了   存进去的就是正的

                        Bitmap bitmap = ImageUtils.decodeUriToBitmap(activity, uri);
                        if (bitmap != null) {
                            photoClip(uri);
                            Bitmap bMapRotate;
                            //保存图片时先进行旋转
                            Configuration config = getResources().getConfiguration();
                            if (config.orientation == 1) {//竖拍
                                Matrix matrix = new Matrix();
                                matrix.reset();
                                matrix.setRotate(90);
                                bMapRotate = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
                                bitmap = bMapRotate;
                            }

这个功能到此就算是实现了   有啥问题  下面刘岩  看到了第一时间回复 或者加我qq 747096409大家交流

          

发布了105 篇原创文章 · 获赞 56 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/suwenlai/article/details/102837997