您的位置:首页 > 其它

关于部分手机调用系统拍照和相册图片出现旋转问题处理

2016-10-25 16:34 846 查看
一、出现问题原因

针对不同手机调用系统拍照会出现拍照后图片自动旋转一定角度,针对开发中遇到的这些问题,特写本博客,望吐槽!

二、解决方案

1

     针对以上问题,制定一下解决方案:

1、调取系统相册或拍照功能

/**

     * actionSheetDialog不带标题

     */

    private void actionSheetDialogNoTitle() {

        new ActionSheetDialog(this)

                .builder()

                .setCancelable(true)

               .setCanceledOnTouchOutside(false)

                .addSheetItem("拍照", SheetItemColor.Blue,

                        newOnSheetItemClickListener() {

                            @Override

                            public voidonClick(int which) {

                                // 这里添加意图启动手机自带照相机

                               Log.d("meyki", "拍照");

                                Intentcameraintent = new Intent(

                                        MediaStore.ACTION_IMAGE_CAPTURE);

                                // 指定调用相机拍照后照片的储存路径

                               cameraintent.putExtra(MediaStore.EXTRA_OUTPUT,

                                       Uri.fromFile(tempFile));

                                startActivityForResult(cameraintent,

                                       PHOTO_REQUEST_TAKEPHOTO);

                            }

                        })

                .addSheetItem("从手机相册选择", SheetItemColor.Blue,

                        new OnSheetItemClickListener(){

                            @Override

                            public voidonClick(int which) {

                               Log.d("meyki", "从手机相册中选择");

                                Intent getAlbum= new Intent(

                                       Intent.ACTION_PICK, Media.EXTERNAL_CONTENT_URI);

                               getAlbum.setType("image/*");

                               startActivityForResult(getAlbum,

                                        PHOTO_REQUEST_GALLERY);

 

                            }

                        }).show();

}

2、调取系统相册中的照片或者刚拍照的照片进行裁剪操作

private void startPhotoZoom(Uri uri) {

1>获取调取照片的旋转角度

        intdegree  =UriPathUtils.readPictureDegree(uri.getPath());

获取图片旋转角度的具体方法

public static int readPictureDegree(String path) {

        intdegree = 0;

        try {

            ExifInterface exifInterface = newExifInterface(path);

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();

        }

        returndegree;

    }

2>当旋转角度不为0时说明照片发生了旋转

       if(Math.abs(degree) > 0){

            try{

                Bitmap mBitmap =MediaStore.Images.Media.getBitmap(this.getContentResolver(),uri);

3>根据照片旋转的角度,进行复位旋转,并保存图片的bitmap对象

               Bitmap nBitmap = UriPathUtils.rotateBitmapByDegree(mBitmap,degree);

图片旋转的具体方法

public static Bitmap rotateBitmapByDegree(Bitmap bm,int degree) {

        BitmapreturnBm = null;

 

        // 根据旋转角度,生成旋转矩阵

        Matrixmatrix = new Matrix();

       matrix.postRotate(degree);

        try {

            // 将原始图片按照旋转矩阵进行旋转,并得到新的图片

           returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(),matrix, true);

        } catch(OutOfMemoryError e) {

        }

        if(returnBm == null) {

           returnBm = bm;

        }

        if (bm!= returnBm) {

           bm.recycle();

        }

        returnreturnBm;

    }

               UriPathUtils.saveBitmap(nBitmap,UriPathUtils.getFileByUri(this,uri));

           }catch (IOException e){

               e.printStackTrace();

            }

        }

      4>调用系统照片裁剪功能

  Intent intent= new Intent("com.android.camera.action.CROP");

       intent.setDataAndType(uri, "image/*");

        // crop为true是设置在开启的intent中设置显示的view可以剪裁

       intent.putExtra("crop", "true");

 

        //aspectX aspectY 是宽高的比例

       intent.putExtra("aspectX", 1);

       intent.putExtra("aspectY", 1);

 

        //outputX,outputY 是剪裁图片的宽高

       intent.putExtra("outputX", 300);

       intent.putExtra("outputY", 300);

       intent.putExtra("return-data", true);

       intent.putExtra("noFaceDetection", true);

       intent.putExtra("uri", uri.getPath());

       System.out.println("22================");

       startActivityForResult(intent, PHOTO_REQUEST_CUT);

    }

5>得到图片的的bitmap对象,并提交服务器

bitmap = data.getParcelableExtra("data");

               if (bitmap == null) {

                    return;

               }

               uploadUserLogo(bitmap);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐