有个上传头像的功能 涉及到拍照 裁剪 相册选择 这几个功能 然后就是一步一个坎。。。。
这个问题的原因就是拍照之后要通知系统刷新相册才能显示 在你想要更新相册的地方 发一个广播
/** * 通过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度
这个是因为手机竖屏拍照的问题 我发现去系统相册查看 就是正常的 我最开始是想可能是我查看图片姿势不对 然后就在查看的时候查看图片是否有旋转 如果有 给他掰正喽 用的是下面的方法 方法行得通 实现了 但是在查看图片的时候会有延迟 体验很不好 下面是代码 有需要的可以用一下
/** * 读取照片旋转角度 * * @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大家交流