簡體   English   中英

如何檢測手電筒是開還是關?

[英]How to detect whether the flashlight is on or off?

我正在開發需要檢查手電筒是否已啟用的游戲。
因此,有沒有可以根據其檢查的參數。

camera.getParameters().getFlashMode().equals(Parameters.FLASH_MODE_TORCH)

如果打開手電筒,該語句曾經返回true,但是現在不起作用。

您可以通過以下方式檢查閃光燈是自動,開啟還是關閉:

Camera.Parameters p= mCamera.getParameters();

if(p.getFlashMode().equals(android.hardware.Camera.Parameters.FLASH_MODE_ON))
{
 //DO STUFF...
}
else if(p.getFlashMode().equals(android.hardware.Camera.Parameters.FLASH_MODE_OFF))
{
//DO STUFF......
}
else if(p.getFlashMode().equals(android.hardware.Camera.Parameters.FLASH_MODE_TORCH))
{
//DO STUFF......
}
else if(p.getFlashMode().equals(android.hardware.Camera.Parameters.FLASH_MODE_AUTO))
{
//DO STUFF......
}
else
{
//DO STUFF.....
}

通過camera2 API,請使用CameraManager來獲取此信息。

首先獲取CameraManager的實例:

CameraManager cm = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);

或者,如果目標API> = 23,則可以使用:

CameraManager cm = context.getSystemService(CameraManager.class);

現在,您需要注冊一個TorchCallback 注冊后,此回調將立即返回所有具有閃光燈的相機設備的所有手電筒的狀態。 此接口有兩種您需要實現的方法:

void onTorchModeChanged(String cameraId, boolean enabled);
void onTorchModeUnavailable(String cameraId);

第一種方法將通知您給定攝像機的割炬是打開還是關閉。 例如,當外接閃光燈閃光燈斷開時,割炬可能會變得完全不可用。

您注冊回調,如下所示:

cameraManager.registerTorchCallback(myTorchCallback, null);

此方法的第二個參數是Handler ,如果您希望在其他線程中調用回調,則可以提供它。 如果提供null ,則使用當前線程。

請注意,您的應用沒有對割炬的獨占訪問權。 其他應用程序和用戶自己可以打開/關閉它。 回調使您可以檢測到這些更改。 例如,如果用戶在應用程序需要時關閉割炬,則可以要求他們打開割炬。

要獲取所有可用的cameraId,您將在回調中收到它們,則可以調用:

String[] cameraIds = cameraManager.getCameraIdList();

您可能還對哪些相機有閃光燈可用感興趣。 例如,要對ID為“ 0”的攝像機進行檢查,您可以執行以下操作:

boolean flashAvailable = cameraManager
  .getCameraCharacteristics("0")
  .get(CameraCharacteristics.FLASH_INFO_AVAILABLE);

最后,您可能需要自己打開/關閉割炬:

cameraManager.setTorchMode("0", true); // ON
cameraManager.setTorchMode("0", false); // OFF

此方法可能會引發CameraAccessException因此請務必檢查文檔以了解詳細信息。

正如@Marcin_Jedynak之前所說,您必須注冊一個回調才能獲取手電筒的狀態。

import android.content.Context;
import android.hardware.camera2.CameraManager;
import android.support.annotation.NonNull;

public class CmManager {
    public static boolean isFlashlightOn = false;
    public static void registerFlashlightState (Context context){
        CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
        cameraManager.registerTorchCallback(torchCallback, null);
    }

    public static void unregisterFlashlightState(Context context) {
        CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
        cameraManager.unregisterTorchCallback(torchCallback);
    }

    private static CameraManager.TorchCallback torchCallback = new CameraManager.TorchCallback() {
        @Override
        public void onTorchModeChanged(@NonNull String cameraId, boolean enabled) {
            super.onTorchModeChanged(cameraId, enabled);
            isFlashlightOn = enabled;
        }
    };
}

調用public static void registerFlashlightState (Context context) ,可以使用isFlashlighOn跟蹤手電筒的狀態。
當您不再需要回調時,請注銷它
更多信息在這里

暫無
暫無

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

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