有个上传头像的功能 涉及到拍照 裁剪 相册选择 这几个功能 然后就是一步一个坎。。。。
第一个问题 拍照后相册查找不到 不显示 系统相册都没有 有的手机需要重启之后才会显示
这个问题的原因就是拍照之后要通知系统刷新相册才能显示 在你想要更新相册的地方 发一个广播
/**
* 通过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;
}
这个功能到此就算是实现了