Android 旧摄像头API-是什么导致解锁()失败?

Android 旧摄像头API-是什么导致解锁()失败?,android,camera,Android,Camera,我正在使用MediaRecorderAPI录制视频片段,并且正在使用不推荐的Camera API。代码如下所示: @TargetApi(Build.VERSION_CODES.LOLLIPOP) private boolean prepareVideoRecorder() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { CameraManager manager = (CameraMana

我正在使用MediaRecorderAPI录制视频片段,并且正在使用不推荐的Camera API。代码如下所示:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private boolean prepareVideoRecorder() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
        try {
            CameraCharacteristics characteristics = manager.getCameraCharacteristics("" + currentCameraId);
            mSensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    mMediaRecorder = new MediaRecorder();
    mCamera.unlock();
    mMediaRecorder.setCamera(mCamera);

    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && mSensorOrientation != null) {
        int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();
        switch (mSensorOrientation) {
            case SENSOR_ORIENTATION_DEFAULT_DEGREES:
                mMediaRecorder.setOrientationHint(DEFAULT_ORIENTATIONS.get(rotation));
                break;
            case SENSOR_ORIENTATION_INVERSE_DEGREES:
                mMediaRecorder.setOrientationHint(INVERSE_ORIENTATIONS.get(rotation));
                break;
        }
    } else {
        if (currentCameraId == 0) {
            mMediaRecorder.setOrientationHint(90);
        } else {
            mMediaRecorder.setOrientationHint(270);
        }
    }

    mMediaRecorder.setMaxDuration(MAX_DURATION_VIDEO);
    mMediaRecorder.setProfile(CamcorderProfile.get(currentCameraId, CamcorderProfile.QUALITY_HIGH));
    mMediaRecorder.setVideoSize(1280, 720);
    outputFile = VideoUtils.getOutputMediaFile(Constant.MEDIA_TYPE_VIDEO);
    mFileObserver = new MyFileObserver(outputFile.toString(), FileObserver.ALL_EVENTS);
    mMediaRecorder.setOutputFile(outputFile.toString());
    mListUri.add(VideoUtils.getOutputMediaFileUri(Constant.MEDIA_TYPE_VIDEO));
    mMediaRecorder.setVideoFrameRate(30);
    mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

    try {
        mMediaRecorder.prepare();
    } catch (IllegalStateException e) {
        Log.d(TAG,
                "IllegalStateException preparing MediaRecorder: "
                        + e.getMessage());
        releaseMediaRecorder();
        return false;
    } catch (IOException e) {
        Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    }
    return true;
}
这适用于大多数设备。但是,还有一些情况下,
mCamera.unlock()
偶尔会抛出
RuntimeException:unlock failed

我深入研究了源代码,看到了以下内容:

static void android_hardware_Camera_unlock(JNIEnv *env, jobject thiz)
{
    ALOGV("unlock");
    sp<Camera> camera = get_native_camera(env, thiz, NULL);
    if (camera == 0) return;
    if (camera->unlock() != NO_ERROR) {
        jniThrowRuntimeException(env, "unlock failed");
    }
}
static void安卓\硬件\摄像头\解锁(JNIEnv*env,jobject thiz)
{
ALOGV(“解锁”);
sp摄像头=获取本地摄像头(环境、thiz、空);
如果(摄像机==0)返回;
如果(摄像头->解锁()!=无错误){
jniThrowRuntimeException(环境,“解锁失败”);
}
}
我认为这是调用
mCamera.unlock()
时执行的代码

我的问题是,如果这真的是解锁摄像头的代码,那么除了
无错误
之外,还有什么原因会导致
摄像头->解锁()