调用Android系统拍照功能后,三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的。其它品牌的手机都是正常的,就三星出现这个怪事。

在Android适配上,我原来一直以为国内的小米手机够奇葩了,结果还有更奇葩的!你说你没事旋转照片干啥,实在是猜不透其居心何在,纯粹是在给开发者制造麻烦啊!
解决办法是获取到拍照后照片被旋转的角度,再旋转回去就好了。
具体思路:
1、首先在调用拍照方法时,保存拍照后的相片原图,得到原图路径,(PhotoBitmapUtils是我自己写的一个工具类)
String fileName = "";
/**
* 启动相机拍照
*/
private void addBitmapShoots() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 设置图片要保存的 根路径+文件名
fileName = PhotoBitmapUtils.getPhotoFileName(getContext());
File file = new File(fileName);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, OPEN_CAMERA);
}
2、在获取相机返回的回调方法onActivityResult()中,修复被旋转的图片并取得修复后的图片路径,有了这个路径后就可以展示出来了
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 获取相机拍照返回
if (resultCode == Activity.RESULT_OK && requestCode == OPEN_CAMERA) {
// 得到修复后的照片路径
String filepath = PhotoBitmapUtils.amendRotatePhoto(fileName, getContext());
}
}
PhotoBitmapUtils类:
/**
* 集合一些图片工具
*
* Created by zhuwentao on 2016-07-22.
*/
public class PhotoBitmapUtils {
/**
* 存放拍摄图片的文件夹
*/
private static final String FILES_NAME = "/MyPhoto";
/**
* 获取的时间格式
*/
public static final String TIME_STYLE = "yyyyMMddHHmmss";
/**
* 图片种类
*/
public static final String IMAGE_TYPE = ".png";
// 防止实例化
private PhotoBitmapUtils() {
}
/**
* 获取手机可存储路径
*
* @param context 上下文
* @return 手机可存储路径
*/
private static String getPhoneRootPath(Context context) {
// 是否有SD卡
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
|| !Environment.isExternalStorageRemovable()) {
// 获取SD卡根目录
return context.getExternalCacheDir().getPath();
} else {
// 获取apk包下的缓存路径
return context.getCacheDir().getPath();
}
}
/**
* 使用当前系统时间作为上传图片的名称
*
* @return 存储的根路径+图片名称
*/
public static String getPhotoFileName(Context context) {
File file = new File(getPhoneRootPath(context) + FILES_NAME);
// 判断文件是否已经存在,不存在则创建
if (!file.exists()) {
file.mkdirs();
}
// 设置图片文件名称
SimpleDateFormat format = new SimpleDateFormat(TIME_STYLE, Locale.getDefault());
Date date = new Date(System.currentTimeMillis());
String time = format.format(date);
String photoName = "/" + time + IMAGE_TYPE;
return file + photoName;
}
/**
* 保存Bitmap图片在SD卡中
* 如果没有SD卡则存在手机中
*
* @param mbitmap 需要保存的Bitmap图片
* @return 保存成功时返回图片的路径,失败时返回null
*/
public static String savePhotoToSD(Bitmap mbitmap, Context context) {
FileOutputStream outStream = null;
String fileName = getPhotoFileName(context);
try {
outStream = new FileOutputStream(fileName);
// 把数据写入文件,100表示不压缩
mbitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
return fileName;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if (outStream != null) {
// 记得要关闭流!
outStream.close();
}
if (mbitmap != null) {
mbitmap.recycle();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 把原图按1/10的比例压缩
*
* @param path 原图的路径
* @return 压缩后的图片
*/
public static Bitmap getCompressPhoto(String path) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 10; // 图片的大小设置为原来的十分之一
Bitmap bmp = BitmapFactory.decodeFile(path, options);
options = null;
return bmp;
}
/**
* 处理旋转后的图片
* @param originpath 原图路径
* @param context 上下文
* @return 返回修复完毕后的图片路径
*/
public static String amendRotatePhoto(String originpath, Context context) {
// 取得图片旋转角度
int angle = readPictureDegree(originpath);
// 把原图压缩后得到Bitmap对象
Bitmap bmp = getCompressPhoto(originpath);;
// 修复图片被旋转的角度
Bitmap bitmap = rotaingImageView(angle, bmp);
// 保存修复后的图片并返回保存后的图片路径
return savePhotoToSD(bitmap, context);
}
/**
* 读取照片旋转角度
*
* @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);
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;
}
}
在调用修复图片角度方法的时候需要注意,现在的手机像素越来越大,拍完后一张照片有近10M,所以我们需要对图片进行压缩处理。不然在保存图片时会等待挺久的,屏幕会黑一会。
参考文档1
参考文档2
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android手机拍照后图片被旋转
# Android拍照后图片被旋转
# Android三星图片被旋转
# Android实现屏幕旋转方法总结
# Android中利用matrix 控制图片的旋转、缩放、移动
# Android Tween动画之RotateAnimation实现图片不停旋转效果实例介绍
# Android开发 旋转屏幕导致Activity重建解决方法
# Android实现图片反转、翻转、旋转、放大和缩小
# Android编程中调用Camera时预览画面有旋转问题的解决方法
# Android开发之图形图像与动画(二)Animation实现图像的渐变/缩放/位移/旋转
# Android 图片缩放与旋转的实现详解
# Android编程实现RotateAnimation设置中心点旋转动画效果
# android实现icon动态旋转效果
# 给你
# 都是
# 文档
# 是在
# 旋转矩阵
# 你说
# 如果没有
# 不存在
# 设置为
# 配上
# 解决办法
# 完后
# 在手
# 需要注意
# 回调
# 上传图片
# 三星手机
# 到新
# 不透
# 干啥
相关文章:
C++用Dijkstra(迪杰斯特拉)算法求最短路径
建站之星与建站宝盒如何选择最佳方案?
Android使用GridView实现日历的简单功能
学校建站服务器如何选型才能满足性能需求?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
建站主机解析:虚拟主机配置与服务器选择指南
制作农业网站的软件,比较好的农业网站推荐一下?
建站之星上传入口如何快速找到?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
如何在阿里云完成域名注册与建站?
如何通过WDCP绑定主域名及创建子域名站点?
建站之星备案流程有哪些注意事项?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
建站主机核心功能解析:服务器选择与网站搭建流程指南
定制建站哪家更专业可靠?推荐榜单揭晓
网页设计网站制作软件,microsoft office哪个可以创建网页?
如何在Golang中指定模块版本_使用go.mod控制版本号
家庭建站与云服务器建站,如何选择更优?
如何制作一个表白网站视频,关于勇敢表白的小标题?
黑客入侵网站服务器的常见手法有哪些?
如何配置FTP站点权限与安全设置?
网站制作需要会哪些技术,建立一个网站要花费多少?
金*站制作公司有哪些,金华教育集团官网?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
如何在阿里云香港服务器快速搭建网站?
焦点电影公司作品,电影焦点结局是什么?
内部网站制作流程,如何建立公司内部网站?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
建站为何优先选择香港服务器?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
建站主机选哪种环境更利于SEO优化?
如何在Tomcat中配置并部署网站项目?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
制作网站的公司有哪些,做一个公司网站要多少钱?
淘宝制作网站有哪些,淘宝网官网主页?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
建站之星会员如何解锁更多建站功能?
网站制作免费,什么网站能看正片电影?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
如何选择香港主机高效搭建外贸独立站?
建站之星×万网:智能建站系统+自助建站平台一键生成
安徽网站建设与外贸建站服务专业定制方案
TestNG的testng.xml配置文件怎么写
如何快速打造个性化非模板自助建站?
,巨量百应是干嘛的?
,怎么用自己头像做动态表情包?
*请认真填写需求信息,我们会在24小时内与您取得联系。