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

mac2024-05-07  37

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

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

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

/** * 通过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; }

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

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

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大家交流

 

 

          

最新回复(0)