相信大家在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();
}
}
这样就拿到了 当初拍照时的图片路径,然后对图片进行处理就可以了!~