android调用系统相机,获取照片的适配性问题

相信很多人开发android或多或少都会涉及到调用系统相机,这样可以省去很多麻烦。

调用系统相机拍照有两张方式可获取照片

第一种是在onActivityResult(int requestCode, int resultCode, Intent data)中直接data获取数据,注意这种方式不能在调用系统相机时传入uri:

Bundle bundle = data.getExtras();  

Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式

但是这种方式发现很多手机data都为空,出现很多适配性问题。


所以建议采用以下的方式

/**
 * 拍照Intent
 */
public File takePhotoIntent( int resultCode) {
File file = newPhotoFile(null);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, resultCode);
return file;

}

private File currentFile = null;

currentFile =takePhotoIntent(PHOTO_CAMERA_GET_RESULT_CODE);

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case PHOTO_CAMERA_GET_RESULT_CODE:
if (currentFile==null ||currentFile.length() < 100) {
showToast("拍照失败"); 
}else{
//执行操作
}

break;
}
}

这样看起来貌似没什么问题,但是实际上用的时候发现有些手机会一直返回“拍照失败的”,比如三星的手机绝大部分会是失败的,(可以看到手机很明显横竖屏切换)后来打印logcat发现,在调用系统相机后再重新回到activity时,activity被重建了,重建的currentFile自然为null。这样会导致一直拍照失败。

问题找到,自然要抽丝拨茧。三星在调用系统相机的时候会出现横竖屏切换,从而导致activity被重建。具体的横竖屏切换生命周期可以参考一下一下博客:http://blog.csdn.net/wulianghuan/article/details/8603982

大概就是

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

于是在AndroidManifest.xml的activty中加入配置,但是不管用,后来才知道android4.0之前版本这样设置是可以的,但之后的版本无效,需要加多一个属性即android:configChanges="orientation|keyboardHidden|screenSize",这样确实可以了。

(对android横竖屏切换的总结,推荐一个比较详细的总结http://blog.csdn.net/jiangxinyu/article/details/8600407)


20161223---貌似在红米1s上没用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值