簡體   English   中英

相機錯誤“無法連接到相機”或某些手機中出現錯誤“相機正在使用其他應用”

[英]Camera Error “Can't Connect to the Camera” or in some phones the error appear “Camera is using by another app”

我已經實現了使用Android MediaRecorder在后台錄制音頻,如果錄音正在進行中並且用戶打開了原生相機來錄制視頻,它給出了

相機錯誤“無法連接到相機”

或者在某些手機上,錯誤顯示為

您的相機正在被其他應用程序使用

在此輸入圖像描述

如果我停止mediarecorder然后原生相機視頻錄制工作正常,我搜索事件,以了解相機何時開始視頻,然后在我的應用程序中我停止mediarecorder,我發現BroadcastReceiver帶過濾器

        <receiver android:name=".receiver.CameraReceiver">
            <intent-filter android:priority="10000">
            <action android:name="android.Medintent.action.CAMERA_BUTTON" />
            <action android:name="android.hardware.action.NEW_PICTURE" />
            <action android:name="android.hardware.action.NEW_VIDEO" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="image/*" />
            <data android:mimeType="video/*" />
        </intent-filter>
    </receiver>

在捕獲圖片或視頻並將其保存在目錄中時觸發NEW_VIDEONEW_PICTURE事件。 任何人都知道如何解決這個問題? 我希望在我的應用程序中知道Native / Camera Apps要錄制視頻時的事件。 提前致謝

即使我有同樣的問題。 一旦應用程序正在使用相機資源,直到它被釋放,您可以在其他應用程序甚至服務中使用它們。 如果任何服務正在使用相機資源,直到它發布相同的我們不能使用相機硬件。 如果使用此代碼正在使用相機硬件,您可以重復檢查: -

 private boolean isCameraInUse() {
    Log.v(TAG, "isCameraInUse()");
    boolean isCameraInUse = false;
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)//Use Camera Api for Version Code < 23 and mCamera manager above it.
    {
        String cameraId = null;
        CameraManager camManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
        // Usually front mCamera is at 0 position.
        try {
            cameraId = camManager.getCameraIdList()[0];
        } catch (CameraAccessException e) {
            Log.e(TAG, Log.getStackTraceString(e));
            isCameraInUse = true;
        }
        try {
            camManager.setTorchMode(cameraId, true);
            camManager.setTorchMode(cameraId, false);
        } catch (CameraAccessException e) {
            Log.e(TAG, Log.getStackTraceString(e));
            isCameraInUse = true;
        }
    } else {
        Camera c = null;
        try {
            c = Camera.open();
        } catch (RuntimeException e) {
            Log.e(TAG, Log.getStackTraceString(e));
            turnFlashOff(mContext);
            isCameraInUse = true;
        } finally {
            if (c != null) c.release();
        }
    }
    return isCameraInUse;
}

CameraManager.AvailabilityCallback提供onCameraAvailable(String cameraId)方法來檢測相機是否可用。 https://developer.android.com/reference/android/hardware/camera2/CameraManager.AvailabilityCallback.html

獲取所有攝像機ID與@GAGAN所示的相同。

CameraManager camManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
        // Usually front mCamera is at position 0.
        try {
            cameraId = camManager.getCameraIdList()[0];
        }  catch (CameraAccessException e) {
            Log.e(TAG, Log.getStackTraceString(e));
            Log.cat("Error: ", e.getReason() + "");
            if (e.CAMERA_DISABLED) { /* ENABLE CAMERA */ }
            else if ( /* ... you can go to the link below to do various logic */ ) {
                //...
            }
            else { /* do nothing */ }
        }

https://developer.android.com/reference/android/hardware/camera2/CameraAccessException.html#CAMERA_IN_USE

注意: 在其他應用程序使用您的相機硬件之前,它們是由他們有目的地使用。 因此,在這些應用程序不能釋放您的硬件之前,您無法使用它,這很明顯。 你無法知道這些應用程序是否真的需要相機。 我們相信流程可以在需要時保留硬件。

但是,我們可以在相機可用(免費)時設置監聽器,以便您可以立即使用它。

CameraManager.AvailabilityCallback availabilityCallback = new CameraManager.AvailabilityCallback() {
    @Override 
    public void onCameraAvailable(String cameraId) {
        // your further stuffs. You must put all of your camera related logic here. 
    }

    public void onCameraUnavailable(String cameraId) {
        //you can logcat camera not available 
    }
};

使用CameraManager.AvailabilityCallback抽象類是在實例化對象時,您執行匿名實例化實現回調,如onCameraAvailable() ,它實際上是您從Camera Observer獲取的listener

答:如果您將相機處理命令放在onCameraAvailable()回調中,我保證,您不會得到您顯示的錯誤。

如果相機在后台被其他應用程序使用,則意味着,那些其他應用程序有點兒錯誤,因為相機需要前景預覽; 即使完成相機,它們也不會釋放相機。 沒有人在背景中使用相機。 即使在這種情況下,也不應該強行殺死相機進程,因為內存泄漏可能會發生。 因為您不知道其他進程如何使用相機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM