调用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部分手机拍照后获取的图片被旋转问题的解决方法...相关推荐

  1. Android 部分手机拍照后获取的图片被旋转

    三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的...其它品牌的手机都是正常的,就三星出现这个怪事. 解决办法是获取到拍照后照片被旋转的角度,再旋转回去就好了. 在获取相机返 ...

  2. android上传图片被旋转,解决android有的手机拍照后上传图片被旋转的问题

    需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器 遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的 ...

  3. android编程 自动裁剪图片,Android编程实现调用相册、相机及拍照后直接裁剪的方法...

    本文实例讲述了Android编程实现调用相册.相机及拍照后直接裁剪的方法.分享给大家供大家参考,具体如下: package com.cvte.health.phone; import java.io. ...

  4. android usb win7,安卓手机USB数据线连接不上win7系统电脑的解决方法

    许多用户都喜欢将手机连接电脑来解决一些问题或者上传一些图片到电脑中存储,不过近日有使用安卓手机的用户在将usb数据线连接电脑的时候,发现无法连接,导致无法上传手机照片图片到电脑上和传送apk手机软件到 ...

  5. android 小米相册无法获取,适配小米华为手机等拍照后获取不到照片

    问题摘要:适配小米华为手机等拍照后获取不到照片 出现场景 普通的相机调用,在 intent 传进去一个路径,然调用这个意图. 在测试机 荣耀 8x 上是没有问题的,能获取到拍的照片. 在小米系统和 华 ...

  6. 手机系统计算机怎么解决办法,手机连接不上电脑怎么办?原因分析及解决方法...

    2016-03-28 16:50:01 手机连接不上电脑怎么办?原因分析及解决方法 标签:手机连不上电脑,手机连不上电脑原因,手机连不上电脑原因解决方法 [ROM之家]我们使用智能手机一般连接电脑的时 ...

  7. win10不显示手机连接到服务器,手机连接win10系统热点显示无互联网连接的解决方法...

    在笔记本电脑中,可以通过wifi共享热点给手机共享上网,阿然而近日有不少win10系统用户发现手机连接热点的时候,显示无互联网连接,虽然连接上了wifi但是没有显现网络,遇到这样的情况如何解决,本文就 ...

  8. 安卓手机USB无法共享、上网或卡顿的解决方法

    安卓手机USB无法共享.上网或卡顿的解决方法 参考文章: (1)安卓手机USB无法共享.上网或卡顿的解决方法 (2)https://www.cnblogs.com/tmdsleep/p/9190898 ...

  9. 解决android有的手机拍照后上传图片被旋转的问题

    需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器 遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的 ...

最新文章

  1. beautifulsoup以及正则表达式re之间的一些知识!
  2. Xen Server二安装xc及管理xen主机
  3. 安装OpenResty开发环境
  4. java对象的类型转换_Java对象的类型转换和属性复制
  5. [UVA315]Network(tarjan, 求割点)
  6. vSAN Health Service-物理磁盘运行状况-物理磁盘运行状况检索问题(2149291)
  7. 【Vue2.0】—Vue与Component的关系(十二)
  8. 命令让手机临时root_Linux 最常用命令(简单易学,但能解决 95% 以上的问题)
  9. Linux的i2c通讯协议
  10. Java中,异常处理try catch的作用域是局部的
  11. Java中几种高性能的队列
  12. 常用EXCEL函数公式入门
  13. 自然语言处理 | (30) 文本相似度计算与文本匹配问题
  14. 华为外包的感受(CSDN)
  15. 各种手机处理器排行榜_手机处理器性能排行榜和代表机型介绍
  16. win2008 R2 安装VS2003
  17. linux下解压命令大全
  18. 费曼:数学与物理学的关系
  19. 方舟进化私服找不到服务器,方舟生存进化私服怎么设置 私人服务器设置方法分享...
  20. GameFramework篇:StarForce资源热更新讲解(二:具体操作步骤)

热门文章

  1. 经典算法: 哈夫曼编码
  2. 现在转行软件测试来得及吗?前景怎样
  3. windows如何注册DLL文件
  4. 百度地图怎么添加公司地址标注
  5. 快速复制网站中的html与css样式代码
  6. 2021 RoboCom 世界机器人开发者大赛-本科组(初赛)!带注释!题解
  7. SQL美化dll,C#
  8. 帆软和思迈特软件Smartbi产品的详细对比
  9. 在吉日嘎拉DotNet.WebForm中使用FluentScheduler调度任务
  10. 马斯克决定任命朱晓彤为特斯拉全球CEO