真正解决三星等手机拍照问题
2015-11-23 17:10
337 查看
相信大家在Android 开发的过程中肯定会遇到拍照的问题,然而利用Android 系统自带的相机肯定是我们的首选 但是在开源力量的强大之下也会有一些 与本身系统不尽一致的存在。例如: 个别三星手机拍照无法正常显示。
1、通过拍照测试 发现是因为手机屏幕旋转造成页面异常关闭
一般情况我们在 AndroidManifest 文件中配置activity 的 screenOrientation="portrait" 来让屏幕只有竖屏显示,但是这个设置在三星手机里无法起到作用。
2、既然无法通过配置来达到我们禁止屏幕旋转的问题,那么我们分析一下activity在异常时生命周期: onSaveInstanceState 总是执行了,而onRestoreInstanceState确不是每次被执行。
onSaveInstanceState 代表当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState() 就回被执行,除非是被用户主动销毁的,例如当用户按back键时
onRestoreInstanceState 则代表这个“确实”被销户了才调用。
所以 我们可以通过重写onSaveInstanceState 方法来保存一下拍照图片路径
2.1、通过设置拍照图片路径名字启动系统相机
/**
* 启动相机拍照 startCamera
*
* @Title: startCamera
* @throws
*/
private void toImageFromCamera() {
imgName = String.valueOf(System.currentTimeMillis());
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File dir = new File(FILEPATH);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, imgName + ".jpg");
localCameraPath = file.getPath();
Uri imageUri = Uri.fromFile(file);
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(openCameraIntent, CrequestCode);
}
2.2、设置图片拍照后回调数据
正常应该返回 onActivityResult 中,但是因为异常无法正常进入,所以在onSaveInstanceState() 方法中利用bundle保存 localCameraPath 路径(拍照时设置的)
2.3、在activity重建时 OnCreate() 方法中 判断 savedInstanceState 是否为 null
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.selectpicture_dialog);
if (savedInstanceState != null) {
saveImgUrl = savedInstanceState.getString(LOCALCAMERAPATH);
//url对应的图片进行压缩处理
saveImgUrl = HandleImg(saveImgUrl);
mls.OnImgPath(saveImgUrl);
}else {
InitView();
}
}
这样就拿到了 当初拍照时的图片路径,然后对图片进行处理就可以了!~
1、通过拍照测试 发现是因为手机屏幕旋转造成页面异常关闭
一般情况我们在 AndroidManifest 文件中配置activity 的 screenOrientation="portrait" 来让屏幕只有竖屏显示,但是这个设置在三星手机里无法起到作用。
2、既然无法通过配置来达到我们禁止屏幕旋转的问题,那么我们分析一下activity在异常时生命周期: onSaveInstanceState 总是执行了,而onRestoreInstanceState确不是每次被执行。
onSaveInstanceState 代表当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState() 就回被执行,除非是被用户主动销毁的,例如当用户按back键时
onRestoreInstanceState 则代表这个“确实”被销户了才调用。
所以 我们可以通过重写onSaveInstanceState 方法来保存一下拍照图片路径
2.1、通过设置拍照图片路径名字启动系统相机
/**
* 启动相机拍照 startCamera
*
* @Title: startCamera
* @throws
*/
private void toImageFromCamera() {
imgName = String.valueOf(System.currentTimeMillis());
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File dir = new File(FILEPATH);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, imgName + ".jpg");
localCameraPath = file.getPath();
Uri imageUri = Uri.fromFile(file);
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(openCameraIntent, CrequestCode);
}
2.2、设置图片拍照后回调数据
正常应该返回 onActivityResult 中,但是因为异常无法正常进入,所以在onSaveInstanceState() 方法中利用bundle保存 localCameraPath 路径(拍照时设置的)
2.3、在activity重建时 OnCreate() 方法中 判断 savedInstanceState 是否为 null
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.selectpicture_dialog);
if (savedInstanceState != null) {
saveImgUrl = savedInstanceState.getString(LOCALCAMERAPATH);
//url对应的图片进行压缩处理
saveImgUrl = HandleImg(saveImgUrl);
mls.OnImgPath(saveImgUrl);
}else {
InitView();
}
}
这样就拿到了 当初拍照时的图片路径,然后对图片进行处理就可以了!~
相关文章推荐
- Android xml资源文件中@、@android:type、@*、?、@+含义和区别
- 老李分享:《Linux Shell脚本攻略》 要点(七)
- 森林病虫防治系统 (三)
- ambari下载地址
- 封装常用数据库方法及连接(config)
- 第13周—项目2 验证克鲁斯卡尔算法
- Sqoop2 vs Sqoop
- AsyncHttpClient 加载图片
- vb调试dll
- CentOS Linux 负载均衡高可用WEB集群之LVS+Keepalived配置
- 项目4(2)
- spring+tomcat接收到的body为空的原因
- 十二周 项目四 利用遍历思想求解图问题(5)
- UVa 11747 Heavy Cycle Edges(最小生成树)
- 第二次随机组队总结
- 黑马程序员——Java重点基础之多态
- ToolBar专题
- 原生js ajax
- 海量用户积分排名算法探讨【转载】
- Offer选择与总结