【今更だけどandroid.hardware.Cameraを使う】Camera.Parametersとは
android.hardware.Cameraを使うことで、Android端末にあるカメラデバイスにアクセスして使うことができます。
android.hardware.Cameraは、現在では非推奨となっていますがOpenCV等ではまだまだ使われています。
Android端末に実装されているカメラデバイスは固有の性能があります。
そのため、ある端末では出来るのに別の端末では出来ないということが多々あります。
今回はカメラデバイスに「設定できる設定値を知る方法」や「設定値を変更する方法」を説明します。
下記の実装はすべて前回までに作ったクラスを修正しています。
Camera.Parametersのインスタンス
カメラデバイスの詳細を知るにはCamera.Parametersを使用します。Camera.Parametersには「カメラデバイスで設定できる値」や「カメラデバイスに現在設定されている値」を保持しています。
これらの値はLinkedHashMap
また、「カメラデバイスの値を変更するメソッド」も定義されています。
Camera.ParametersインスタンスはCamera.Parameters getParameters()で取得することができます。
取得したCamera.Parametersインスタンスは後述するメソッドで設定値を変更することができます。
しかし、Camera.Parametersインスタンスの設定値を変更しただけでは、カメラデバイスに設定値の反映はされません。
そのため、void setParameters(Camera.Parameters params)を使って、Camera.ParametersインスタンスをCameraインスタンスに渡す必要があります。
また、設定値にはカメラプレビュー中に変更すると「例外が発生する設定値」や「例外が発生しないが反映されない設定値」があるので注意が必要です。
前回作ったMyCameraPreview#startPreviewを修正します。
private void startPreview() {
mCamera = Camera.open(this.cameraId);
updateCameraParameters();
try {
mCamera.setPreviewDisplay(mHolder);
} catch (IOException e) {
e.printStackTrace();
}
mCamera.setDisplayOrientation(getCameraDisplayOrientation());
mCamera.startPreview();
}
private void updateCameraParameters() {
Camera.Parameters parameters = mCamera.getParameters();
// Camera.Parametersの変更
mCamera.setParameters(parameters);
}
Camera.Parametersの設定値を文字列化する
Camera.Parametersには大量の設定値が存在します。String flatten()を使うことで、この大量の設定値を”key1=value1;key2=value2;…”という形式の文字列を取得することができます。
private void updateCameraParameters() {
Camera.Parameters parameters = mCamera.getParameters();
Log.d(TAG, "updateCameraParameters: " + parameters.flatten());
mCamera.setParameters(parameters);
}
Camera.Parametersの設定値を取得する
Camera.Parametersに現在されている設定値を取得するにはString get(String key)とint getInt(String key)を使います。設定値は文字列か数値で設定されています、この違いによって二つのメソッドを使い分ける必要があります。
private void updateCameraParameters() {
Camera.Parameters parameters = mCamera.getParameters();
Log.d(TAG, "updateCameraParameters: " + parameters.flatten());
Log.d(TAG, "updateCameraParameters: effect / " + parameters.get("effect"));
Log.d(TAG, "updateCameraParameters: zoom / " + parameters.getInt("zoom"));
mCamera.setParameters(parameters);
}
Camera.Parametersの設定値を変更する
Camera.Parametersに現在されている設定値を変更するにはvoid set(String key, String value)とvoid set(String key, int value)を使います。第一引数のkeyは変更する設定値の項目名を指定します。第二引数のvalueは変更する設定値を指定します。
カメラデバイスに対応する値以外を設定すると例外が発生するので注意が必要です。また、カメラプレビュー中に設定すると例外になる場合もあるので注意が必要です。
private void updateCameraParameters() {
Camera.Parameters parameters = mCamera.getParameters();
Log.d(TAG, "updateCameraParameters: before / " + parameters.flatten());
Log.d(TAG, "updateCameraParameters: before effect / " + parameters.get("effect"));
parameters.set("effect" , Camera.Parameters.EFFECT_MONO);
Log.d(TAG, "updateCameraParameters: after effect / " + parameters.get("effect"));
Log.d(TAG, "updateCameraParameters: before zoom / " + parameters.getInt("zoom"));
parameters.set("zoom" , 50);
Log.d(TAG, "updateCameraParameters: after zoom / " + parameters.getInt("zoom"));
Log.d(TAG, "updateCameraParameters: after / " + parameters.flatten());
mCamera.setParameters(parameters);
}
Camera.Parametersの設定値を削除する
Camera.Parametersに現在されている設定値を削除するにはvoid remove(String key)を使います。しかし、Camera.Parameters#removeを使い削除するには注意が必要です。 設定値によっては削除した状態でCamera#setParameters時に例外が発生したり、例外は発生されずデフォルト値が使用されたりします。
private void updateCameraParameters() {
Camera.Parameters parameters = mCamera.getParameters();
Log.d(TAG, "updateCameraParameters: before / " + parameters.flatten());
Log.d(TAG, "updateCameraParameters: before effect / " + parameters.get("effect"));
parameters.set("effect" , "hoge");
Log.d(TAG, "updateCameraParameters: after effect / " + parameters.get("effect"));
Log.d(TAG, "updateCameraParameters: before zoom / " + parameters.getInt("zoom"));
parameters.set("zoom" , 50);
Log.d(TAG, "updateCameraParameters: after zoom / " + parameters.getInt("zoom"));
Log.d(TAG, "updateCameraParameters: before remove effect / " + parameters.get("effect"));
parameters.remove("effect");
Log.d(TAG, "updateCameraParameters: after remove effect / " + parameters.get("effect"));
Log.d(TAG, "updateCameraParameters: after / " + parameters.flatten());
mCamera.setParameters(parameters);
}
文字列を元にCamera.Parametersの設定値を変更する
Camera.Parameters#flattenを使って得た設定値文字列はvoid unflatten(String flattened)を使うことで設定値文字列の内容を各設定値に反映することができます。Camera.Parametersの内容を設定値文字列としてプリファレンス等に保存し、Camera.Parameters#unflattenを使い反映するといった。設定値を保存するような使い方が可能になります。
private void updateCameraParametersFromString(String flatten) {
// flatten = "key1=value1;key2=value2;key3=value3;..."
Camera.Parameters parameters = mCamera.getParameters();
parameters.unflatten(flatten);
mCamera.setParameters(parameters);
}
まとめ
Camera.Parametersに定義されている、設定値を取得、更新する基本的なメソッドを説明しました。しかし、今回説明したメソッドはあまり使うことはありません。一般的な設定値(エフェクト、ズーム等)の取得、更新するメソッドは別に定義されています。
下記はCamera.Parametersに定義されている設定値の一覧です。
| 設定キー | 説明 | Camera.Parameters内メソッド | 誤った値 | 削除時 | プレビュー中の変更 |
|---|---|---|---|---|---|
| focal-length | カメラデバイスの焦点距離のキーです。 | float getFocalLength() | - | - | - |
| horizontal-view-angle | カメラデバイスの水平視野角のキーです。 | float getHorizontalViewAngle() | - | - | - |
| vertical-view-angle | カメラデバイスの水直視野角のキーです。 | float getVerticalViewAngle() | - | - | - |
| preview-size-values | デバイスがサポートしているプレビューサイズ一覧 | List | - | - | - |
| preview-size | 現在のプレビューサイズの設定値 | Camera.Size getPreviewSize() void setPreviewSize(int width, int height) | 例外発生 | 例外発生 | 例外発生 |
| preview-frame-rate-values | カメラデバイスがサポートしているフレームレートリストのキーです。 | List | - | - | - |
| preview-frame-rate | カメラデバイスに現在設定されているフレームレートのキーです。 | int getPreviewFrameRate() void setPreviewFrameRate(int fps) | 例外発生 | 例外発生 | 即時反映 |
| preview-fps-range-values | カメラデバイスがサポートしているFPSのキーです。値には1000が掛けられた整数値が使われます。実際のFPSは1000で割った値です。 | List | - | - | - |
| preview-fps-range | カメラデバイスに現在設定されているFPSのキーです。値には1000が掛けられた整数値が使われます。実際のFPSは1000で割った値です。 | void getPreviewFpsRange(int[] range) void setPreviewFpsRange(int min, int max) | 例外発生 | 例外発生 | 即時反映 |
| preview-format-values | カメラデバイスがサポートしているプレビューのフォーマットリストのキーです。 | List | - | - | - |
| preview-format | カメラデバイスに現在設定されているプレビューのフォーマットのキーです。 | int getPreviewFormat() void setPreviewFormat(int pixel_format) | 例外発生 | デフォルトの適用 | 例外発生 |
| effect-values | カメラデバイスがサポートしているエフェクトリストのキーです。 | List | - | - | - |
| effect | カメラデバイスに現在設定されているエフェクトのキーです。 | String getColorEffect() void setColorEffect(String value) | 例外発生 | デフォルトの適用 | 即時反映 |
| scene-mode-values | カメラデバイスがサポートしている撮影シーンモードリストのキーです。 | List | - | - | - |
| scene-mode | カメラデバイスに現在設定されている撮影シーンモードのキーです。 | String getSceneMode() void setSceneMode(String value) | 例外発生 | デフォルトの適用 | 即時反映 |
| zoom-supported | カメラデバイスがズーム機能をサポートしているかどうかのキーです。 | boolean isZoomSupported() | - | - | - |
| smooth-zoom-supported | カメラデバイスがスムーズズーム機能をサポートしているかどうかのキーです。 | boolean isSmoothZoomSupported() | - | - | - |
| max-zoom | カメラデバイスがサポートしている最大ズームステップ値のキーです。 | int getMaxZoom() | - | - | - |
| zoom-ratios | カメラデバイスがサポートしているズームステップに対応する倍率値リストのキーです。 | List | - | - | - |
| zoom | カメラデバイスに現在設定されているズームステップ値のキーです。 | int getZoom() void setZoom(int value) | 例外発生 | 例外発生 | 即時反映 |
| whitebalance-values | カメラデバイスがサポートしているプリセットホワイトバランスリストのキーです。 | List | - | - | - |
| whitebalance | カメラデバイスに現在設定されているプリセットホワイトバランスのキーです。 | String getWhiteBalance() void setWhiteBalance(String value) | 例外発生 | デフォルトの適用 | 即時反映 |
| auto-whitebalance-lock-supported | カメラデバイスがオートホワイトバランスロック機能をサポートしているかどうかキーです。 | boolean isAutoWhiteBalanceLockSupported() | - | - | - |
| auto-whitebalance-lock | カメラデバイスに現在オートホワイトバランスロック機能が有効かどうかのキーです。 | boolean getAutoWhiteBalanceLock() void setAutoWhiteBalanceLock(boolean toggle) | - | デフォルトの適用 | 即時反映 |
| focus-mode-values | カメラデバイスがサポートしているフォーカスモードリストのキーです。 | List | - | - | - |
| focus-mode | カメラデバイスに現在設定されているフォーカスモードのキーです。 | String getFocusMode() void setFocusMode(String value) | 例外発生 | 例外発生 | 即時反映 |
| max-exposure-compensation | カメラデバイスがサポートしている最大露出補正指数のキーです。 | int getMaxExposureCompensation() | - | - | - |
| min-exposure-compensation | カメラデバイスがサポートしている最小露出補正指数のキーです。 | int getMinExposureCompensation() | - | - | - |
| exposure-compensation-step | カメラデバイスがサポートしている露出補正ステップのキーです。 | float getExposureCompensationStep() | - | - | - |
| exposure-compensation | カメラデバイスに現在設定されている露出補正指数のキーです。 | int getExposureCompensation() void setExposureCompensation(int value) | 例外発生 | 例外発生 | 即時反映 |
| auto-exposure-lock-supported | カメラデバイスが自動露出補正ロック機能をサポートしているかどうかキーです。 | boolean isAutoExposureLockSupported() | - | - | - |
| auto-exposure-lock | カメラデバイスに現在、自動露出補正ロック機能が有効かどうかのキーです。 | boolean getAutoExposureLock() void setAutoExposureLock(boolean toggle) | - | デフォルトの適用 | 即時反映 |
| flash-mode-values | カメラデバイスがサポートしているフラッシュライトモードリストのキーです。 | List | - | - | - |
| flash-mode | カメラデバイスに現在設定されているフラッシュライトモードのキーです。 | String getFlashMode() void setFlashMode(String value) | 例外発生 | デフォルトの適用 | 即時反映 |
| focus-distances | カメラデバイスに現在の各フォーカス距離キーです。 | void getFocusDistances(float[] output) | - | - | - |
| max-num-focus-areas | カメラデバイスがサポートしている最大フォーカスエリア数のキーです。 | int getMaxNumFocusAreas() | - | - | - |
| focus-areas | カメラデバイスに現在設定されているフォーカスエリアリストのキーです。 | List void setFocusAreas(List | 例外発生 | 例外発生 | 即時反映 |
| max-num-metering-areas | カメラデバイスがサポートしている最大測光エリア数のキーです。 | int getMaxNumMeteringAreas() | - | - | - |
| metering-areas | カメラデバイスに現在設定されている測光エリアリストのキーです。 | List void setMeteringAreas(List | 例外発生 | 例外発生 | 即時反映 |
| picture-format-values | カメラデバイスがサポートしている写真フォーマットのキーです。 | List | - | - | - |
| picture-format | カメラデバイスに現在設定されている写真フォーマットのキーです。 | int getPictureFormat() void setPictureFormat(int pixel_format) | 例外発生 | デフォルトの適用 | 即時反映 |
| picture-size-values | カメラデバイスがサポートしている写真サイズリストのキーです。 | List | - | - | - |
| picture-size | カメラデバイスに現在設定されている写真サイズのキーです。 | Camera.Size getPictureSize() void setPictureSize(int width, int height) | 例外発生 | 例外発生 | 即時反映 |
| jpeg-quality | カメラデバイスに現在設定されているJPEG品質のキーです。 | int getJpegQuality() void setJpegQuality(int quality) | 例外発生 | 例外発生 | 即時反映 |
| jpeg-thumbnail-size-values | カメラデバイスがサポートしているサムネイルサイズリストのキーです。 | List | - | - | - |
| jpeg-thumbnail-height | カメラデバイスに現在設定されているサムネイルの高さのキーです。 | Camera.Size getJpegThumbnailSize() void setJpegThumbnailSize(int width, int height) | 例外発生 | 例外発生 | 即時反映 |
| jpeg-thumbnail-width | カメラデバイスに現在設定されているサムネイルの幅のキーです。 | Camera.Size getJpegThumbnailSize() void setJpegThumbnailSize(int width, int height) | 例外発生 | 例外発生 | 即時反映 |
| jpeg-thumbnail-quality | カメラデバイスに現在設定されているサムネイルのJPEG品質のキーです。 | int getJpegThumbnailQuality() void setJpegThumbnailQuality(int quality) | 例外発生 | 例外発生 | 即時反映 |
| rotation | カメラデバイスに現在設定されている写真の向きのキーです。 | void setRotation(int rotation) | 例外発生 | 例外発生 | 即時反映 |
| antibanding-values | カメラデバイスがサポートしているアンチバンディングリストのキーです。 | List | - | - | - |
| antibanding | カメラデバイスに現在設定されているアンチバンディングのキーです。 | void setAntibanding(String antibanding) | 例外発生 | デフォルトの適用 | 即時反映 |
| gps-timestamp | カメラデバイスに現在設定されているGPS時間のキーです。 | void removeGpsData() void setGpsTimestamp(long timestamp) | - | - | 即時反映 |
| gps-processing-method | カメラデバイスに現在設定されているGPS-processing-methodのキーです。 | void removeGpsData() void setGpsProcessingMethod(String processing_method) | - | - | 即時反映 |
| gps-latitude | カメラデバイスに現在設定されている緯度のキーです。 | void removeGpsData() void setGpsLatitude(double latitude) | - | - | 即時反映 |
| gps-longitude | カメラデバイスに現在設定されている経度のキーです。 | void removeGpsData() void setGpsLongitude(double longitude) | - | - | 即時反映 |
| gps-altitude | カメラデバイスに現在設定されている高度のキーです。 | void removeGpsData() void setGpsAltitude(double altitude) | - | - | 即時反映 |
| max-num-detected-faces-hw | カメラデバイスがサポートしているハードウェア顔検出の最大同時検出数のキーです。 | int getMaxNumDetectedFaces() | - | - | - |
| max-num-detected-faces-sw | カメラデバイスがサポートしているソフトウェア顔検出の最大同時検出数のキーです。 | int getMaxNumDetectedFaces() | - | - | - |
| video-frame-format | カメラデバイスに設定されているデフォルトのビデオフレームのフォーマットのキーです。 | - | - | - | - |
| video-size-values | カメラデバイスがサポートしているビデオサイズリストのキーです。 | List | - | - | - |
| video-size | カメラデバイスに設定されているデフォルトのビデオサイズのキーです。 | - | - | - | - |
| preferred-preview-size-for-video | カメラデバイスに設定されている推奨ビデオサイズのキーです。 | Camera.Size getPreferredPreviewSizeForVideo() | - | - | - |
| video-stabilization-supported | カメラデバイスが手振れ補正機能(揺れ安定化機能)をサポート状況のキーです。 | boolean isVideoStabilizationSupported() | - | - | - |
| video-stabilization | カメラデバイスに設定されている手振れ補正機能(揺れ安定化機能)の有効無効のキーです。 | boolean getVideoStabilization() void setVideoStabilization(boolean toggle) | - | デフォルトの適用 | 即時反映 |
| recording-hint | カメラデバイスがビデオ向けに使われるかどうかをヒントとして渡すかどうかを表すキーです。 | void setRecordingHint(boolean hint) | - | デフォルトの適用 | - |
| video-snapshot-supported | カメラデバイスがビデオ向けに使われるかどうかをヒントとして渡すかどうかを表すキーです。 | boolean isVideoSnapshotSupported() | - | - | - |