我在 onPause() onResume() 相机实时循环中遇到了一些问题:带有预览功能的相机和拍照完全正常。除了一个例外:
我启动应用程序,单击主页按钮,切换回应用程序并拍摄另一张照片。
结果:shuttercallback 仍然执行(参见代码),但 jpeg 回调不再执行!然后我的星系 S 振动,屏幕保持黑色,因为在 jpegCallback 之后没有重新触发 startPreview()。堆栈跟踪对我来说远没有用。奇怪的是,这只发生在我的 Galaxy S 上,而不是模拟器上。我真的不知道如何继续前进:/有人知道什么有用吗?
10-28 18:59:40.649:错误/SecCamera(4291):SetRotate(角度(0)) 10-28 18:59:40.649: 错误/CameraHardwareSec(4291): ====setParameters processingmethod = (null) 10-28 18:59:40.649:错误/SecCamera(4291):setRecordingSize(宽度(800),高度(480)) 10-28 18:59:40.673:错误/SecCamera(4291):SetRotate(角度(0)) 10-28 18:59:40.673: 错误/CameraHardwareSec(4291): ====setParameters processingmethod = (null) 10-28 18:59:40.673:错误/SecCamera(4291):setRecordingSize(宽度(800),高度(480)) 10-28 18:59:40.692:错误/SecCamera(4291):SetRotate(角度(0)) 10-28 18:59:40.692: 错误/CameraHardwareSec(4291): ====setParameters processingmethod = (null) 10-28 18:59:40.692:错误/SecCamera(4291):setRecordingSize(宽度(800),高度(480)) 10-28 18:59:40.712:错误/SecCamera(4291):SetRotate(角度(0)) 10-28 18:59:40.712: 错误/CameraHardwareSec(4291): ====setParameters processingmethod = (null) 10-28 18:59:40.712:错误/SecCamera(4291):setRecordingSize(宽度(800),高度(480)) 10-28 18:59:40.751: 错误/CameraHardwareSec(4291): stopPreview() 10-28 18:59:40.751: 错误/SecCamera(4291): cancelAutofocus() 10-28 18:59:40.751: 错误/SecCamera(4291): cancelAutofocus() end, 0, 4 10-28 18:59:40.768: 错误/SecCamera(4291): stopPreview() 10-28 18:59:40.768: 错误/SecCamera(4291): fimc_v4l2_streamoff() 10-28 18:59:40.797: 错误/CameraHardwareSec(4291): stopPreview() 结束 10-28 18:59:41.622: 错误/SecCamera(4291): fimc_v4l2_streamoff() 10-28 18:59:46.536:错误/dalvikvm(2993):无法将堆栈跟踪写入 /data/anr/traces.txt(2970 中的 2775):未知错误:0 10-28 18:59:46.540: 错误/dalvikvm(2919): 无法将堆栈跟踪写入 /data/anr/traces.txt (-1 of 3414): 数学结果不可表示 10-28 18:59:46.610: 错误/dalvikvm(3044): 无法将堆栈跟踪写入 /data/anr/traces.txt (3354 of 7154): 数学结果不可表示 ...
这是我的(缩短的)代码:
公共类 CameraActivity 扩展 Activity 实现 MenuViewCallback、CutoutPathManagerCallback { public static final String TAG = "CutoutCamera"; 预览预览; OverlayView 覆盖; 静态MenuView menuView; @覆盖 公共无效 onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 隐藏窗口标题。 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); ... preview = (Preview) this.findViewById(R.id.preview); ... } ... @覆盖 受保护的无效 onResume() { 超级.onResume(); this.log("onResume()"); 预览.openCamera(); } @覆盖 受保护的无效 onPause() { 超级.onPause(); this.log("onPause()"); if (preview.camera != null) { preview.camera.release(); preview.camera = null; } } // 快门打开时调用 ShutterCallback shutterCallback = new ShutterCallback() { // 公共无效 onShutter() { Log.d(TAG, "onShutter'd"); } }; // 处理原始图片的数据 PictureCallback rawCallback = new PictureCallback() { // public void onPictureTaken(byte[] data, Camera camera) { Log.d(TAG, "onPictureTaken - raw"); } }; //处理jpeg图片的数据 PictureCallback jpegCallback = new PictureCallback() { // public void onPictureTaken(byte[] data, Camera camera) { Log.d(TAG, "onPictureTaken - jpeg"); ... } }; @覆盖 公共无效 shootButtonClicked() { preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); } @覆盖 公共无效focusButtonClicked(){ preview.camera.autoFocus(new Camera.AutoFocusCallback() { public void onAutoFocus(布尔成功,相机相机){ } }); } }
/** * 执行顺序: * 开放式摄像头() * onMeasure() * onLayout() * onMeasure() * onLayout() * 表面创建() * 表面变化() * onMeasure() * onLayout() * onMeasure() * @作者斯蒂芬 * */ 类 Preview 扩展 ViewGroup 实现 SurfaceHolder.Callback { // 私人静态最终字符串标签=“预览”; SurfaceHolder mHolder;// 公共摄像头摄像头;// 私有列表supportedPreviewSizes; 私人尺寸 previewSize; SurfaceView mSurfaceView; 相机活动相机活动; int l2 = 0, t2 = 0, r2 = 0, b2 = 0; int 填充 = 20; 尺寸最佳预览尺寸、最佳图片尺寸; // 这个视图的大小。在 onMeasure() 中设置 整型全宽,全高; 公共预览(上下文上下文){ 超级(上下文); 初始化(上下文); } 公共预览(上下文上下文,AttributeSet attrs){ 超级(上下文,属性); 初始化(上下文); } 公共预览(上下文上下文,AttributeSet attrs,int defStyle){ 超级(上下文,属性,defStyle); 初始化(上下文); } 私人无效初始化(上下文上下文){ setKeepScreenOn(true); cameraActivity = (CameraActivity) 上下文; mSurfaceView = new SurfaceView(context); addView(mSurfaceView); mHolder = mSurfaceView.getHolder(); // mHolder.addCallback(this); // mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // } ... 公共无效openCamera(){ cameraActivity.log("openCamera()"); 如果(this.camera == null){ cameraActivity.log("Camera.open()"); this.camera = Camera.open(); //supportedPreviewSizes = camera.getParameters().getSupportedPreviewSizes(); 请求布局();// -> onMeassure() -> onLayout() } } @覆盖 受保护的无效onMeasure(int widthMeasureSpec,int heightMeasureSpec){ cameraActivity.log("onMeasure()"); // 我们故意忽略子测量,因为充当 // 封装到以相机预览为中心的 SurfaceView // 拉伸它。 fullWidth = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); fullHeight = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); setMeasuredDimension(fullWidth, fullHeight); 如果(this.camera != null){ cameraActivity.log("fullSize:"+fullWidth+"x"+fullHeight); this.setCameraPreviewSize(); this.setCameraPictureSize(); } } 私人无效 calcScaledPreviewSize(){ ... } ... 私人无效 setCameraPreviewSize() { Camera.Parameters 参数 = camera.getParameters(); if(parameters.getPreviewSize() != this.getOptimalPreviewSize()){ 参数.setPreviewSize(this.getOptimalPreviewSize().width, this.getOptimalPreviewSize().height); this.camera.setParameters(参数); } } 私人无效 setCameraPictureSize() { Camera.Parameters 参数 = this.camera.getParameters(); 如果(参数。getPictureSize()!= this.getOptimalCameraPictureSize()){ 参数.setPictureSize(getOptimalCameraPictureSize().width, getOptimalCameraPictureSize().height); this.camera.setParameters(参数); } } @覆盖 protected void onLayout(boolean changed, int l, int t, int r, int b) { cameraActivity.log("onLayout()"); if (更改 && getChildCount() > 0 && this.camera != null) { 最终视图子 = getChildAt(0); cameraActivity.log("r:"+this.getPreviewRight()+" l:"+this.getPreviewLeft()+" b:"+this.getPreviewBottom()+" t:"+this.getPreviewTop()); child.layout(this.getPreviewLeft(), this.getPreviewTop(), this.getPreviewRight(), this.getPreviewBottom()); cameraActivity.initOverlay(this.getPreviewLeft(),this.getPreviewTop(),this.getPreviewRight(),this.getPreviewBottom()); } } 私人尺寸 getOptimalPreviewSize() { if(optimalPreviewSize == null){ //计算最佳预览尺寸 } 返回最佳预览尺寸; } 私人尺寸 getOptimalCameraPictureSize() { 如果(最佳图片大小 == 空){ //计算最佳图像尺寸 } 返回最佳图片大小; } // 一旦持有者准备好调用 public void surfaceCreated(SurfaceHolder holder) { // // Surface 已创建,获取相机并告诉它在哪里 // 绘制。 cameraActivity.log("surfaceCreated()"); 尝试 { if (this.camera != null) { this.camera.setPreviewDisplay(holder); } } 捕捉(IOException 异常){ Log.e(TAG, "由 setPreviewDisplay() 引起的 IOException", 异常); } } 公共无效surfaceChanged(SurfaceHolder持有人,int格式,int w,int h){ cameraActivity.log("surfaceChanged()"); 如果(相机!= null){ Camera.Parameters 参数 = camera.getParameters(); 参数.setPreviewSize(getOptimalPreviewSize().width, getOptimalPreviewSize().height); 请求布局(); camera.setParameters(参数); camera.startPreview(); } } public void surfaceDestroyed(SurfaceHolder holder) { // cameraActivity.log("surfaceDestroyed()"); 如果(this.camera != null){ camera.stopPreview(); } } 公共无效释放相机(){ cameraActivity.log("releaseCamera()"); 如果(相机!= null){ camera.stopPreview(); camera.setPreviewCallback(null); 相机.release(); 相机=空; } } }