拍摄照片发生反转,变量初始null
2016-03-02 11:24
447 查看
小编发现像Samsung或MEIZU等部分机子所拍摄的照片存在反转的问题,且拍摄设置上并没有启动“反向存储”的功能。那为何拍摄后取出来的照片被反转了,难道真的是机子本身的感应器产生作用了?如果有知晓的亲请告知。下面为拍摄反转的解决草案。
1.注册权限
2.拍摄照片
3.获取照片
3.1.照片压缩
3.2.获取原照片角度
3.3.根据角度值反转
以上为获取拍摄的照片并解决反转的问题,小编参考了其他更多作者的实现。还有一问题就是嵌套使用Fragment的UI,从Camera跳转回来后成员变量被初始Null了,其实是在开启Camera并旋转屏幕的时候将重新执行生命周期,且Activity被系统回收所致,固然得在注册表里为Activity声明禁用横竖屏切换
一开始小编也不晓得为何要加上“screenSize”,后来看到有作者称如果在android3.2以后的版本中没有添加”screenSize”的话依然会触发横竖屏activity销毁周期(也就是说不能屏蔽activity销毁,从而调用onConfigurationChanged方法,而在3.2之前只要设置orientation|keyboardHidden就可以)。相信很多人加了声明之后仍旧不行,那么还得复写Activity的onConfigurationChanged
这样一来小编既解决了获取拍摄图片角度反转的问题,也解决了变量被初始Null的问题了。相信有其他更高效的解决方案,受教。另外以上内容仅供参考,如有表述不正确的也请为小编论道!
1.注册权限
<!-- 开启Camera权限 --> <uses-permission android:name="android.permission.CAMERA" /> <!-- 在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
2.拍摄照片
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String path = Environment.getExternalStorageDirectory() + "/定义存放文件夹名字/"; String name = String.valueOf(System.currentTimeMillis()) + ".png"; File file = new File(path); if (!file.exists()) file.mkdirs(); String pathStr = path + name; openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(pathStr))); startActivityForResult(openCameraIntent, "定义请求结果标识");
3.获取照片
Bitmap bitmap = revitionImageSize(path);// 获取并压缩图片 int degree = readImageDegree(path);// 获取原拍摄角度 bitmap = rotaingImageView(degree, bitmap);// 还原图片角度 ImageView控件.setImageBitmap(bitmap);
3.1.照片压缩
public static Bitmap revitionImageSize(String path) throws IOException { BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(path))); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeStream(in, null, options); in.close(); int i = 0; Bitmap bitmap = null; while (true) { if ((options.outWidth >> i <= 1000) && (options.outHeight >> i <= 1000)) { in = new BufferedInputStream( new FileInputStream(new File(path))); options.inSampleSize = (int) Math.pow(2.0D, i); options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeStream(in, null, options); break; } i += 1; } return bitmap; }
3.2.获取原照片角度
public static int readImageDegree(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; }
3.3.根据角度值反转
public static Bitmap rotaingImageView(int angle , Bitmap bitmap) { if(bitmap == null) return null; // 旋转图片 动作 Matrix matrix = new Matrix();; matrix.postRotate(angle); System.out.println("angle2="+ angle); // 创建新的图片 Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); return resizedBitmap; }
以上为获取拍摄的照片并解决反转的问题,小编参考了其他更多作者的实现。还有一问题就是嵌套使用Fragment的UI,从Camera跳转回来后成员变量被初始Null了,其实是在开启Camera并旋转屏幕的时候将重新执行生命周期,且Activity被系统回收所致,固然得在注册表里为Activity声明禁用横竖屏切换
android:configChanges="orientation|keyboardHidden|screenSize"
一开始小编也不晓得为何要加上“screenSize”,后来看到有作者称如果在android3.2以后的版本中没有添加”screenSize”的话依然会触发横竖屏activity销毁周期(也就是说不能屏蔽activity销毁,从而调用onConfigurationChanged方法,而在3.2之前只要设置orientation|keyboardHidden就可以)。相信很多人加了声明之后仍旧不行,那么还得复写Activity的onConfigurationChanged
public void onConfigurationChanged( android.content.res.Configuration newConfig) { // 这里什么都不要做 super.onConfigurationChanged(newConfig); };
这样一来小编既解决了获取拍摄图片角度反转的问题,也解决了变量被初始Null的问题了。相信有其他更高效的解决方案,受教。另外以上内容仅供参考,如有表述不正确的也请为小编论道!
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件