相机无法在运行棉花糖的Astro Tab A10上正确释放

粉红爵士

我有以下一些代码可以使用相机:

@Override
public void surfaceCreated(SurfaceHolder holder) {
    if (mCamera == null) {
        mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
        try {
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private void resetCamera() {
    if (!videoReset) {
        if (videoStarted && !videoStopped) {
            mMediaRecorder.stop();
        }
        MediaScannerConnection.scanFile(TherapistActivity.this, new String[]{videoFile.getAbsolutePath()}, null, null);

        mMediaRecorder.reset();
        mMediaRecorder.release();
        mCamera.release();
        mCamera = null;
        mMediaRecorder = null;

        videoReset = true;
        initSuccess = false;

    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    surfaceWidth = width;
    surfaceHeight = height;
    try {
        if (!initSuccess)
            startPreview(mHolder.getSurface());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void initRecorder(Surface surface) throws IOException {
        Camera.Parameters parameters = mCamera.getParameters();
        Camera.Size previewSize = getOptimalPreviewSize(surfaceWidth, surfaceHeight);

        if (previewSize != null) {
            parameters.setPreviewSize(previewSize.width, previewSize.height);
        }
        parameters.setVideoStabilization(false);
        mCamera.setParameters(parameters);
        mCamera.startPreview();
        mCamera.unlock();

        if (mMediaRecorder == null) mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setCamera(mCamera);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        mMediaRecorder.setVideoEncodingBitRate(3072 * 1000);
        mMediaRecorder.setVideoFrameRate(60);
        mMediaRecorder.setVideoSize(1280, 720);
        mMediaRecorder.setOutputFile(videoFile.getAbsolutePath());

        if (!mApp.videoTime) {
            mMediaRecorder.setMaxDuration(30000);
        } else {
            mMediaRecorder.setMaxDuration(Integer.MAX_VALUE);
        }
        mMediaRecorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {
            @Override
            public void onInfo(MediaRecorder mr, int what, int extra) {
                if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {
                      mCameraWrapper.setBackgroundColor(Color.TRANSPARENT);
                    try {     
                        mCamera.stopPreview();
                        videoRecorded = true;
                    } catch (RuntimeException re) {
                        Log.e("Error", "Could not stop camera!");
                    } finally {
                        videoPreviewStarted = false;
                    }
                    btRecord.setTag("stop");
                    btRecord.setBackgroundResource(R.drawable.stop_nobkgrnd_gray);
                    tvVideoCountdown.setVisibility(View.GONE);
                    initSuccess = false;
                }
            }
        });
        try {
            mMediaRecorder.prepare();
            videoPreviewStarted = true;
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
        initSuccess = true;
    }
}

private Camera.Size getOptimalPreviewSize(int w, int h) {
    Camera.Size result = null;
    Camera.Parameters p = mCamera.getParameters();
    for (Camera.Size size : p.getSupportedPreviewSizes()) {
        if (size.width <= w && size.height <= h) {
            if (result == null) {
                result = size;
            } else {
                int resultArea = result.width * result.height;
                int newArea = size.width * size.height;

                if (newArea > resultArea) {
                    result = size;
                }
            }
        }
    }
    return result;
}

在运行棉花糖的Astro Tab A10上,第二次运行相机时,显然无法正确释放相机,因为在重新启动设备之前,相机无法打开。我非常确定这不是权限问题,因为我在运行时将应用程序的权限授予了摄像头,并且在清单中包括了摄像头权限。

有谁知道可能是什么问题?

编辑:这是堆栈跟踪:

  E/AndroidRuntime: FATAL EXCEPTION: main
       Process: com.mobilityresearch.treadmill3, PID: 4144
       java.lang.RuntimeException: Fail to connect to camera service
           at android.hardware.Camera.<init>(Camera.java:495)
           at android.hardware.Camera.open(Camera.java:341)
           at com.mobilityresearch.treadmill3.TherapistActivity.surfaceCreated(TherapistActivity.java:8260)
           at android.view.SurfaceView.updateWindow(SurfaceView.java:583)
           at android.view.SurfaceView.setVisibility(SurfaceView.java:257)
           at com.mobilityresearch.treadmill3.TherapistActivity$26.onClick(TherapistActivity.java:1701)
           at android.view.View.performClick(View.java:5204)
           at android.view.View$PerformClick.run(View.java:21153)
           at android.os.Handler.handleCallback(Handler.java:739)
           at android.os.Handler.dispatchMessage(Handler.java:95)
           at android.os.Looper.loop(Looper.java:148)
           at android.app.ActivityThread.main(ActivityThread.java:5417)
           at java.lang.reflect.Method.invoke(Native Method)
           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:742)
           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:632)

在其他任何平板电脑上都不会发生这种情况。实际上,在运行Android 5.1 Lollipop的较旧版本的Astro Tab A10上不会发生这种情况。我尝试在打开预览之前和关闭预览之后resetCamera调用相机,但是它不起作用。surfaceCreatedsurfacedDestroyed

编辑2:我只是发现,如果我实际录制视频,它可以正常工作,但是,如果我不录制视频而仅显示预览,则它不起作用。

编辑3:添加了surfaceChanged和initRecorder。更新了resetCamera。

萨加尔

您错过了一个呼叫,stopPreview()呼叫停止将预览帧捕获并绘制到曲面上,setPreviewDisplay(null)并释放预览显示。

更新resetCamera()如下:

private void resetCamera() {
        ...
        mCamera.stopPreview();
        mCamera.setPreviewDisplay(null);
        mCamera.release();
        ...

    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何授予对棉花糖上运行的android应用的权限?

android:相机无法在棉花糖中打开

无法获取Api 5.0(棒棒糖和棉花糖)及更高版本上的电话联系信息

应用程序可在API 26上运行,但在API 23(棉花糖)上崩溃

在Android棉花糖(API v23)的Cordova / phonegap项目上添加运行时权限

应用在Nexus 6 Android棉花糖“ N”帧上的运行速度非常慢

通过Tab键单击时无法获得元素的正确位置

android上的AudioRecord无法在棉花糖上使用。错误说未初始化的AudioRecord

如何正确使用棉花糖在Mysql上插入新数据?

如何确保我的应用程序无法安装在棉花糖上

android.support.v7.widget.Toolbar在棉花糖设备上无法正常工作

棉花糖上不显示圆形图标

关闭JavaFX Tab不会释放内存

Winforms将Tab插入Tab控件的正确位置

从棉花糖及以上的棉花糖设备上的onCreate中读取外部存储中的文件

防止jQuery Tab在Active Tab上执行过渡效果

Echo TAB无法正常工作

Tab键无法正常工作

在Galaxy Tab / Android 4.1.2上无法安装obb文件;在Android 4.4.4上正常工作

Astro Tab A724的Android设备驱动程序

Command + Tab在MacOS上无法始终如一地工作

使用ListView的DrawerLayout无法处理Samsung Tab / Android 5.0.2上的项目单击

在Android棉花糖上获取realPath返回null?

清除棉花糖以上OS版本上的缓存

在仿真设备(棉花糖)上测试可访问性

自定义图像视图在棉花糖上丢失状态

VirtualBox中的棉花糖:安装卡在GRUB上

Android:如何禁止用户更改棉花糖上的权限

Android棉花糖(6.0)上的vibrate_when_ringing