Android在部分手机上调用完相机之后,取不到uri 并且本activity的所有变量都为null的现象

这个问题调了很久,回来之后不管怎么样,所有变量都是null了,很奇怪,一开始就一对象回收了。后来才想到有可能是activity重建了,之前一直没想到是因为,根本没有发生横竖屏切换的效果,但是事实上,系统就是那样处理了,这应该是某些机型上的bug。所以不用纠结,出现变量为null的话 加上禁止横竖屏就行了



一般情况下,我们大部分情况是通过传递uri的方式来调用系统相机的:
Intent intent = new Intent(MediaStore .ACTION_IMAGE_CAPTURE) ;
mTakePhotoUri = FileUtils .getOutputMediaFileUri(FileUtils .MEDIA_TYPE_IMAGE) ;
intent .putExtra(MediaStore .EXTRA_OUTPUT, mTakePhotoUri) ;
                 startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) ;

这种通过指定uri存储路径的方式调用系统相机的方式

在onActivityResult的时候,返回的intent会没有数据

因此我们一般都是在onActivityResult里获取之前保留的uri(例子中的mTakePhotoUri,这个变量是个全局变量)变量来获取具体图片文件。

正式因为这个问题,导致不管调用系统相机导致app退到后台被释放
还是三星之类的手机调用相机时的自动旋转
都会导致调用相机的界面被释放并重建,从而使得Activity界面的全局变量值丢失。

如果没有在onSaveInstanceState里保存这个全局变量,在onRestoreInstanceState取回mTakePhotoUri的值,那重建之后的界面变量就丢失了,因此onActivityResult中取到的mTakePhotoUri就为null了,从而导致获取图片路径变量的时候报null。

经过测试,经过这样的处理后,大部分相机的崩溃问题都得以解决。

其实不仅是相机,很多功能在实际开发过程中都可能遇到因界面被释放导致变量数据丢失的情况,所以我们需要在onSaveInstanceState方法中根据实际情况来保存需要的变量,在onRestoreInstanceState方法中取回变量。

 二:

简单说一下问题:
有些手机拍照成功,有些手机拍完照后确定返回后activity数据丢失,被销毁了。
问题查找:
经过代码查找发现,当这些出问题的手机被调用系统手机拍照时,当前activity被销毁了之后又被重新创建了。即Acitivity 执行了ondestory()–>onCreate(),所以Activity被重新创建了从而内部的数据丢失,而按照正常的逻辑该Activity应该入后台堆栈。一开始以为是系统启用照相机内存不够自动销毁回收。可有些手机不会出现该问题。很无奈。
之后经过本人细心研究activity的生命周期才恍然大悟,原来当手机横竖屏时系统会重新创建一个activity,这就是为什么上个activity会ondestory()–>onCreate()。但为什么有些手机会执行有些不会呢。问题就出在横竖屏上。因为有些手机的系统照相机弄的很炫会自动旋转90度,从而导致了横竖屏的发生(–!看来最潮的也不是好东西,苦了我们这些碼农)。这就是为什有些手机会发生有些不会。跟系统照相机是否旋转有关系。
最后贴上解决方案。
AndroidMainifest.xml中加入

@Override public void onConfigurationChanged(Configuration newConfig) { 其实这里什么都不要做 super.onConfigurationChanged(newConfig); }

PS:在level13以后加入了一个screenSize的属性,这个属性很重要如果在android3.2以后的版本中没有添加”screenSize”的话依然会触发横竖屏activity销毁周期(也就是说不能屏蔽activity销毁,从而调用onConfigurationChanged方法,而在3.2之前只要设置orientation|keyboardHidden就可以)。由于智能机的迅速普及手机的系统大多数升级到4.0以上,这样会导致很多没有设置screenSize属性的程序activity又出现销毁情况。

试试如下代码:
AndroidMainifest.xml中加入

复写acitivity的onConfigurationChanged方法

@Override public void onConfigurationChanged(Configuration newConfig) {
其实这里什么都不要做
super.onConfigurationChanged(newConfig); } 


猜你喜欢

转载自blog.csdn.net/sinat_31311947/article/details/79271690