Android Camera开发:扫描二维码,周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled)

浏览:1131 ℃
字体:
发布时间:2013-12-09 23:23:51
来源:

问题背景:要让Camera循环聚焦,聚焦完成后进行拍照,在拍照的数据里截取出一定区域的数据。在initCamera里设置聚焦模式:

 

			List allFocus = myParam.getSupportedFocusModes();			for(String ff:allFocus){				Log.i(tag, ff + ...FOCUS...);			}			if(allFocus.contains(Camera.Parameters.FLASH_MODE_AUTO)){				myParam.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);  				Focus_Mode = 1;			}			else if(allFocus.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)){				myParam.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);  // FOCUS_MODE_CONTINUOUS_PICTURE FOCUS_MODE_AUTO				Focus_Mode = 2;			}			myCamera.setParameters(myParam);

然后有个GetPictureThread进行每隔一段时间聚焦并且拍照:

 

 

	class GetPictureThread implements Runnable{		public void run() {			// TODO Auto-generated method stub			while(!Thread.currentThread().isInterrupted()){				if(myCamera != null && isPreview){					if(Focus_Mode == 1 && (!isFocusing)){						myCamera.autoFocus(mAutoFocusCallback);					}					else if(Focus_Mode == 2){						myCamera.takePicture(myShutterCallback, null, myJpegCallback);					}					try {						Thread.sleep(3000);					} catch (InterruptedException e) {						// TODO Auto-generated catch block						e.printStackTrace();						Thread.currentThread().interrupt();					}				}			}		}	}

原来设的GetPictureThread是每隔1200毫秒触发一次,在中兴的Geek手机上一切良好。在华为G700上,总是拍一张就挂,挂的log如下:

 

 

12-07 18:05:33.227: D/dalvikvm(13589): threadid=11: exiting12-07 18:05:33.227: W/dalvikvm(13589): threadid=11: thread exiting with uncaught exception (group=0x417669a8)12-07 18:05:33.230: E/AndroidRuntime(13589): FATAL EXCEPTION: Thread-117712-07 18:05:33.230: E/AndroidRuntime(13589): java.lang.RuntimeException: autoFocus failed12-07 18:05:33.230: E/AndroidRuntime(13589): 	at android.hardware.Camera.native_autoFocus(Native Method)12-07 18:05:33.230: E/AndroidRuntime(13589): 	at android.hardware.Camera.autoFocus(Camera.java:1120)12-07 18:05:33.230: E/AndroidRuntime(13589): 	at org.yanzi.rectphoto_wuzhou.RectPhoto$GetPictureThread.run(RectPhoto.java:428)12-07 18:05:33.230: E/AndroidRuntime(13589): 	at java.lang.Thread.run(Thread.java:838)12-07 18:05:33.240: I/Camera(13589): handleMessage: 2

反正就是auto focus出问题了,单看这里的log看不出所以然来。话说2000元买的G'700还是支持自动聚焦的吧。截取所有的log又看了次,搜索关键字:autofocus,得到以下信息:

 

 

  F:.log (12 hits)	Line 12829: 12-08 10:14:19.477 D/CameraClient(  142): autoFocus (pid 10314)	Line 12831: 12-08 10:14:19.477 D/MtkCam/CamDevice(  142): (599)(Default:0)[CamDevice::autoFocus] +	Line 12834: 12-08 10:14:19.477 D/MtkCam/CamAdapter(  142): (599)(Default)[autoFocus] +	Line 12861: 12-08 10:14:19.477 D/aaa_hal (  142): [autoFocus()]	Line 12877: 12-08 10:14:19.477 D/MtkCam/CamAdapter(  142): (599)(Default)[autoFocus] -	Line 20489: 12-08 10:14:20.677 D/CameraClient(  142): autoFocus (pid 10314)	Line 20491: 12-08 10:14:20.677 D/MtkCam/CamDevice(  142): (142)(Default:0)[CamDevice::autoFocus] +	Line 20503: 12-08 10:14:20.678 E/MtkCam/CamDevice(  142): (142)(Default:0)[CamDevice::autoFocus] preview is not enabled (autoFocus){#552:mediatek/hardware/camera/device/CamDevice/CamDevice.cpp}	Line 20503: 12-08 10:14:20.678 E/MtkCam/CamDevice(  142): (142)(Default:0)[CamDevice::autoFocus] preview is not enabled (autoFocus){#552:mediatek/hardware/camera/device/CamDevice/CamDevice.cpp}	Line 20512: 12-08 10:14:20.679 E/AndroidRuntime(10314): java.lang.RuntimeException: autoFocus failed	Line 20514: 12-08 10:14:20.679 E/AndroidRuntime(10314): 	at android.hardware.Camera.native_autoFocus(Native Method)	Line 20516: 12-08 10:14:20.679 E/AndroidRuntime(10314): 	at android.hardware.Camera.autoFocus(Camera.java:1120)
可以看到,上面提到preview is not enabled,竟然说preview没有开启。可我明明preview已经开启了,而且我在扫描线程里设置了判断if(myCamera != null && isPreview)。参考国外这位大大的帖子http://www.hitziger.net/blog/android-camera-autofocus-failed/ 上面提到auto focus失败原因是surfaceholder还没有被创建,换句话camera还没有开启预览就进行自动聚焦了。但其实我的扫描线程启动已经加了延迟,确保camera预览已经开启,姑且信了吧。把线程开启的地方加到了surfacechanged,因为我的initcamera是在surfacechanged里面,initcamera的最后就是startPreview。但依然出错。我加了个延迟在surfacechanged依旧报错。后来参考又一个人的帖子,在activity的onResume方法里进行mySurfaceHolder.addCallback(this);确保surfaceview已经创建了再添加回调。这样干确实严谨一点,但依旧报错。事实上这样做不是必须的,因为我把GetPictureThread去掉之后,一切ok。我加个button,拍照的时候自动聚焦,如果聚焦成功再触发takePicture也是ok的。

 

问题出在哪呢?最后才恍然大悟,问题在拍照的jpegCallback上,代码如下:

 

	PictureCallback myJpegCallback = new PictureCallback() 	{		public void onPictureTaken(byte[] data, Camera camera) {			// TODO Auto-generated method stub			Log.i(tag, myJpegCallback:onPictureTaken...);			long t1 = System.currentTimeMillis();			if(null != data){				mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);							myCamera.stopPreview();				isPreview = false;			}			Matrix matrix = new Matrix();			matrix.postRotate((float)90.0);			Bitmap rotaBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, false);			//Bitmap sizeBitmap = Bitmap.createScaledBitmap(rotaBitmap, 540, 800, true);			Bitmap rectBitmap = Bitmap.createBitmap(rotaBitmap, square.left, square.top, square.width(), square.height());			if(null != rectBitmap)			{							saveThread.setSaveBitmap(rectBitmap);			}			//ImageUtil.saveJpeg(rotaBitmap);			myCamera.startPreview();			isPreview = true;			long t2 = System.currentTimeMillis();			Log.i(tag, 本次保存耗时: + (t2 - t1) + 毫秒);		}	};
注意在拍照时,camera首先停止预览保存完照片后再次开启预览。尽管我加了isPreview这个标志,但这个标志位是不起啥作用的。推测,stoppreviw和startpreview的时候,camera在底层是异步处理的。也就是说程序执行到startpreview,isPreview为真了,但这时camera还没有完全开启预览,而扫描线程再次触发auto focus就会报上面的错误。后来我对这个myJpegCallback测了下时间,完全同样的代码,在geek手机上是900多毫秒左右,在G700上是1800毫秒左右,将近2秒了,所以扫描周期一定得大于这个时间。后来将扫描周期设为3秒,两个手机都ok了。但G700上偶发的也还是会报错,这是因为内存占用太多,手机速度变慢,myJpegCallback回调的周期超过了3秒,重启下手机就好了。在AutoFocusCallback里设置标志isFocusing也是必须的。

 

 

final AutoFocusCallback mAutoFocusCallback = new AutoFocusCallback() {		public void onAutoFocus(boolean success, Camera camera) {			// TODO Auto-generated method stub			isFocusing = true;			if(success){				Log.i(tag, 聚焦成功...);				myCamera.takePicture(myShutterCallback, null, myJpegCallback);			}			else{				Log.i(tag, 聚焦失败...);			}				isFocusing = false;		}	};

看来,要玩Camera还是得整个高端点的手机啊!!!

 

闂傚倸鍊搁崐鐑芥嚄閸洏鈧焦绻濋崟顓狀槱婵炴潙鍚嬪ḿ娆戝閸ф鈷戞い鎺嗗亾缂佸顕划濠氬冀椤撶喓鍘搁梺鎼炲劗閺呮稖鈪撮梻浣呵归鍡涘箰閹间礁鐓″璺猴功閺嗭箓鏌涢妷銏℃珖闁绘稏鍎崇槐鎾诲磼濞嗘帩鍞归梺閫炲苯澧柛鐔锋健椤㈡棃顢橀悩顐壕閻熸瑥瀚粈鍐磼鐠囪尙澧︽鐐插暣閸╋繝宕ㄩ姘导婵$偑鍊栭幐鐐叏閾忣偆顩查柕蹇曞Л閺€浠嬫煟閹存繃宸濋柛鎺斿缁绘盯寮堕幋婵愪純濡ょ姷鍋涚换姗€寮幘缁樻櫢闁跨噦鎷�/QQ 1602007闂傚倸鍊搁崐鐑芥倿閿旈敮鍋撶粭娑樻噽閻瑩鏌熸潏楣冩闁搞倖鍔栭妵鍕冀椤愵澀绮堕梺娲诲幗椤ㄥ牓骞夌粙娆惧悑濠㈣泛锕﹂崢娲⒑閸濆嫬鏆欓柣妤€妫欓崕顐︽⒒娴g懓顕滅紒璇插€垮畷鎰板川婵犲嫷娲搁梺璇″瀻閳ь剟寮ㄦ禒瀣厽婵☆垵娉曠花鍧楁煕韫囨挻婀伴柕鍥у楠炲洭顢旈崱娆戝幆闂備礁鎼惌澶屾崲濠靛棛鏆﹂柟鐑樺灍閸亪骞栧ǎ顒€鐏柡鍡欏仜閳规垿鎮欏顔兼婵犳鍠楅幐鎶藉箖瑜旈獮妯兼嫚閼碱剛鏆伴梻浣告啞濞诧箓宕归柆宥呯;闁告洦鍨遍悡锝夌叓閸ャ劍灏伴悹鎰剁節瀵偊宕奸妷锔规嫽婵炴挻鍩冮崑鎾寸箾娴e啿鍚樺☉妯滄棃宕担瑙勬珗闂備礁鎲℃笟妤呭窗濮樿翰鈧懘寮婚妷锔惧幐闂佹悶鍎弲娑㈠几閺冨牊鐓冮柣鐔稿鏁堥梺鍝勮嫰缁夎淇婇悜钘壩ㄩ柕澶涢檮閻︼綁鏌i悢鍝ョ煁婵犮垺锚铻炴俊銈呮噺缁犳帡姊绘担鍛靛湱鎹㈤幒妤€鐓曢柛顐g妇閺嬫棃鏌¢崘銊モ偓褰掑窗閹扮増鍋ㄦい鏍电到閺嬬喖鎮楀鐐
>更多相关文章
24小时热门资讯
24小时回复排行
闂傚倸鍊峰ù鍥敋瑜忛埀顒佺▓閺呮粎绮悢鑲烘棃鍩€椤掑喚鏆伴梺璇插閸愬骞忛敓锟� 闂傚倸鍊搁崐椋庣矆娴h櫣绀婂┑鐘插€寸紓姘辨喐閹达箑桅闁规壆澧楅崐鐑芥煟閵忋垺鏆╅柣锝呯埣濮婃椽妫冨☉姘辩杽闂佺ǹ锕ュú鏍亱濠碘槅鍨甸崑鎰涢娑栦簻闁规崘娉涙禒锕傛煕閿濆懏鎲哥紒杈ㄥ浮椤㈡瑩鎳為妷銉э紦闂備礁鎼惌澶岀礊娓氣偓瀹曟椽鏁嶉崟銊ヤ壕闁挎繂楠告禍婊勩亜韫囥儲瀚�
闂傚倸鍊搁崐椋庣矆娓氣偓楠炲鍨鹃幇浣圭稁婵犵數濮甸懝鍓у婵犳碍鐓熼柡鍐ㄥ€哥敮鍓佺磼閻樺磭澧柍瑙勫灴閹晠骞撻幒鎾搭唲婵$偑鍊栧ú婵囥仈閹间礁绠為柕濞垮労濞笺劑鏌涢埄鍐炬當妞ゎ偒浜娲传閵夈儺鈧捇鏌熼崙銈嗗 闂傚倸鍊峰ù鍥敋瑜忛埀顒佺▓閺呯姴鐣峰Ο鑽ょ瘈婵﹩鍘搁幐鍐⒑閸涘﹥澶勯柛蹇旂〒閹广垽宕卞▎鎰瀾闂佸搫鍊归娆撳吹閺囥垺鐓熼柕蹇曞Т椤ュ繘鏌℃担鍝バi柟渚垮妼椤粓宕卞Δ鈧~顐︽⒑閸涘鎴犳暜濡ゅ啯宕叉繛鎴欏灩缁狅綁鏌i幇顓熺稇闂傚绉剁槐鎾寸瑹閸パ勭亪缂備礁顦遍幊鎾活敋閿濆棛绡€婵﹩鍘兼禍婊堟⒑缁嬭法绠抽柛妯犲啠鏋旈煫鍥ㄧ⊕閳锋垿鏌涘┑鍡楊仼闁哄棙鐟╅弻娑欑節閸屾稖纭€缂備緡鍠栭悧鎾诲极閹剧粯鏅搁柨鐕傛嫹
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2025 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();