Android の Camera2 API を使って カメラの機能一覧を取得する

[Android の Camera2 API を使って カメラのプレビュー画面を表示する](https://qiita.com/ohwada/items/7bb65a566114066c8ced)
の続きです。

### 概要

Camera2 API では、多彩な機能が提供されているが。
機種依存性がある。
自分の端末ではどんな機能が使えるのか調べるためのアプリが
Google Play で公開されている。

[Camera2 probe PRO](https://play.google.com/store/apps/details?id=de.weis.camera2probepro)

調べた結果をEメールでアプリの開発者に送信する機能があり、
下記のサイトに収集される。

[Camera2 probeWiki](https://github.com/TobiasWeis/android-camera2probe/wiki)

このアプリは、Github にソースが公開されている。
これを例にして、 カメラの機能を説明する。

[Camera2Probe](https://github.com/TobiasWeis/android-camera2probe)


### Hardware Level

カメラデバイスの全体的な機能のレベル

```
   Integer level = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
```

[reference: INFO_SUPPORTED_HARDWARE_LEVEL](https://developer.android.com/reference/android/hardware/camera2Camera/Characteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL)

下記の値をとる

CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_xxx

|Value|Name|Remarks|
|:------------:|:------------:|:------------:|
|0|LIMITED| |
|1|FULL||
|2|LEGACY||
|3|LEVEL_3| |
|4|EXTERNAL|Added in API level 28|

機能の順序 LEGACY < LIMITED < FULL < LEVEL_3.

### カメラ機能 Capabilities

サポートするカメラ機能の一覧

```
        int[] modes = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
```

[reference: REQUEST_AVAILABLE_CAPABILITIES](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#REQUEST_AVAILABLE_CAPABILITIES)

下記の値をとる

CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_xxx

|Value|Name|Remarks|
|:------------:|:------------:|:------------:|
|0|BACKWARD_COMPATIBLE| |
|1|MANUAL_SENSOR| |
|2|POST_PROCESSING| |
|3|RAW| |
|4|REPROCESSING| |
|5|READ_SENSOR_SETTINGS| |
|6|BURST_CAPTURE| |
|7|YUV_REPROCESSING| |
|8|DEPTH_OUTPUT| |
|9|CONSTRAINED_HIGH_SPEED_VIDEO| |
|10|MOTION_TRACKING|Added in API level 28|


LIMITEDおよびFULLモードのカメラデバイスはOFFモード(マニュアルモード)をサポートする。


### 自動焦点 Auto Focus

サポートする自動焦点の機能の一覧

```
   int[] mode = characteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES)
```
[reference: CONTROL_AF_AVAILABLE_MODES](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#CONTROL_AF_AVAILABLE_MODES)

 下記の値をとる

CameraMetadata.CONTROL_AF_MODE_xxx

|Value|Name|Remarks|
|:------------:|:------------:|:------------:|
|0|OFF| |
|1|AUTO| |
|2|MACRO| |
|3|CONTINUOUS_VIDEO| |
|4|CONTINUOUS_PICTURE| |
|5|EDOF| |


### 手動焦点

手動焦点に関するパラメータとして、
下記のものが取得できる。


```
// 最小の焦点距離
            float distance = characteristics.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
```


### 自動露出 Auto Exposure

サポートする自動露出の機能の一覧

```
   int[] mode = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES)
```

[reference: CONTROL_AE_AVAILABLE_MODES](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#CONTROL_AE_AVAILABLE_MODES)


 下記の値をとる

CameraMetadata.CONTROL_AE_MODE_xxx

|Value|Name|Remarks|
|:------------:|:------------:|:------------:|
|0|OFF| |
|1|ON| |
|2|ON_AUTO_FLASH| |
|3|ON_ALWAYS_FLASH| |
|4|ON_AUTO_FLASH_REDEYE| |
|5|ON_EXTERNAL_FLASH|Added in API level 28 |

すべてのカメラデバイスはONモード（フラッシュなしの自動露出）をサポートする

ＦＵＬＬモードのカメラデバイスはOFFモード(マニュアルモード)をサポートする。

### 手動露出

アプリケーションから露光時間(exposure time)、センサ感度(sensor sensitivity)などを制御できる。

手動露出に関するパラメータとして、下記のものが取得できる。


```
// 露光時間の範囲
    Range<Long> range = characteristics.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE);

// 感度の範囲
Range<Integer> range = characteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE);

// 絞りの値の一覧
    float[] apertures = characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES);
```


### 自動ホワイトバランス Auto White Balance

サポートする自動ホワイトバランスの機能の一覧

```
   int[] mode = characteristics.get(CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES)
```

[reference: CONTROL_AWB_AVAILABLE_MODES](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#CONTROL_AWB_AVAILABLE_MODES)

下記の値をとる

CameraMetadata.CONTROL_AWB_MODE_xxx

|Value|Name|Remarks|
|:------------:|:------------:|:------------:|
|0|OFF| |
|1|AUTO| |
|2|INCANDESCENT| |
|3|FLUORESCENT| |
|4|WARM_FLUORESCENT| |
|5|DAYLIGHT| |
|6|CLOUDY_DAYLIGHT| |
|7|TWILIGHT| |
|8|SHADE| |


### 手動ホワイトバランス

ホワイトバランスに関して、取得できるパラメータはないようです。


### スクリーンショット
![camera212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/1db081a5-b3c0-a57f-250b-a3cd0531d2bb.png)

サンプルコードをgithub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/Camera212