OSDN Git Service

内蔵カメラの状態パネルについて実装。
authorMRSa <mrsa@myad.jp>
Sun, 25 Jul 2021 13:14:40 +0000 (22:14 +0900)
committerMRSa <mrsa@myad.jp>
Sun, 25 Jul 2021 13:14:40 +0000 (22:14 +0900)
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/camerax/operation/CameraControl.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/camerax/operation/CameraXCameraStatusHolder.kt

index 660a94b..d471b3c 100644 (file)
@@ -1,10 +1,15 @@
 package jp.osdn.gokigen.gokigenassets.camera.camerax.operation
 
+import android.annotation.SuppressLint
+import android.hardware.camera2.CameraMetadata
+import android.hardware.camera2.CaptureRequest.*
 import android.util.Log
 import android.util.Size
 import android.view.Surface
 import android.view.View
 import androidx.appcompat.app.AppCompatActivity
+import androidx.camera.camera2.interop.Camera2CameraControl
+import androidx.camera.camera2.interop.CaptureRequestOptions
 import androidx.camera.core.Camera
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.ImageAnalysis
@@ -129,6 +134,8 @@ class CameraControl(private val activity : AppCompatActivity, private val prefer
                 cameraProvider.unbindAll()
                 cameraXCamera = cameraProvider.bindToLifecycle(activity, cameraSelector, preview, imageCapture)
                 cameraXCameraControl.setCameraControl(cameraXCamera)
+
+                setCaptureRequestOptions(cameraXCamera.cameraControl)
             }
             catch(e : Exception)
             {
@@ -204,6 +211,8 @@ class CameraControl(private val activity : AppCompatActivity, private val prefer
                 cameraProvider.unbindAll()
                 cameraXCamera = cameraProvider.bindToLifecycle(activity, cameraSelector, imageCapture, imageAnalyzer)
                 cameraXCameraControl.setCameraControl(cameraXCamera)
+
+                setCaptureRequestOptions(cameraXCamera.cameraControl)
             }
             catch(e : Exception)
             {
@@ -214,6 +223,32 @@ class CameraControl(private val activity : AppCompatActivity, private val prefer
         }, ContextCompat.getMainExecutor(activity))
     }
 
+    @SuppressLint("UnsafeOptInUsageError")
+    private fun setCaptureRequestOptions(cameraControl : androidx.camera.core.CameraControl)
+    {
+        try
+        {
+            val requestOptionsBuilder = CaptureRequestOptions.Builder()
+            requestOptionsBuilder.setCaptureRequestOption(CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO)   // CONTROL_MODE_USE_SCENE_MODE
+            requestOptionsBuilder.setCaptureRequestOption(CONTROL_SCENE_MODE, CameraMetadata.CONTROL_SCENE_MODE_DISABLED)
+            requestOptionsBuilder.setCaptureRequestOption(CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON)  // CONTROL_AE_MODE_ON
+            requestOptionsBuilder.setCaptureRequestOption(CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_AUTO)
+            requestOptionsBuilder.setCaptureRequestOption(CONTROL_EFFECT_MODE, CameraMetadata.CONTROL_EFFECT_MODE_OFF)
+            requestOptionsBuilder.setCaptureRequestOption(LENS_OPTICAL_STABILIZATION_MODE, CameraMetadata.LENS_OPTICAL_STABILIZATION_MODE_ON)
+            //requestOptionsBuilder.setCaptureRequestOption(FLASH_MODE, CameraMetadata.FLASH_MODE_OFF)  // CameraMetadata.FLASH_MODE_TORCH
+            //requestOptionsBuilder.setCaptureRequestOption(EDGE_MODE, CameraMetadata.EDGE_MODE_HIGH_QUALITY)  // CameraMetadata.EDGE_MODE_OFF
+            //requestOptionsBuilder.setCaptureRequestOption(COLOR_CORRECTION_MODE, CameraMetadata.COLOR_CORRECTION_MODE_HIGH_QUALITY)
+            //requestOptionsBuilder.setCaptureRequestOption(CONTROL_AE_ANTIBANDING_MODE, CameraMetadata.CONTROL_AE_ANTIBANDING_MODE_AUTO)
+            //requestOptionsBuilder.setCaptureRequestOption(HOT_PIXEL_MODE, CameraMetadata.HOT_PIXEL_MODE_OFF)
+            //requestOptionsBuilder.setCaptureRequestOption(NOISE_REDUCTION_MODE, CameraMetadata.NOISE_REDUCTION_MODE_HIGH_QUALITY)
+            Camera2CameraControl.from(cameraControl).captureRequestOptions = requestOptionsBuilder.build()
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
     override fun finishCamera()
     {
         try
index 5a5950a..2cc7eda 100644 (file)
@@ -3,8 +3,9 @@ package jp.osdn.gokigen.gokigenassets.camera.camerax.operation
 import android.annotation.SuppressLint
 import android.graphics.Color
 import android.hardware.camera2.CameraCharacteristics
-import android.hardware.camera2.CaptureRequest.*
+import android.hardware.camera2.CaptureRequest
 import android.util.Log
+import android.util.Range
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatus
 
 class CameraXCameraStatusHolder(private val cameraXCameraControl: CameraXCameraControl) : ICameraStatus
@@ -12,9 +13,9 @@ class CameraXCameraStatusHolder(private val cameraXCameraControl: CameraXCameraC
     companion object
     {
         private val TAG = CameraXCameraStatusHolder::class.java.simpleName
+        private const val isDumpStatus = false
     }
 
-
     override fun getStatusList(key: String): List<String?>
     {
         return (ArrayList<String>())
@@ -46,65 +47,128 @@ class CameraXCameraStatusHolder(private val cameraXCameraControl: CameraXCameraC
     @SuppressLint("UnsafeOptInUsageError")
     private fun getTakeMode() : String
     {
-/*
+        var takeMode = ""
         try
         {
             val cameraControl = cameraXCameraControl.getCamera2CameraControl()
             if (cameraControl != null)
             {
-                Log.v(TAG, "  -========-")
                 val captureOptions = cameraControl.captureRequestOptions
                 // https://developer.android.com/reference/android/hardware/camera2/CaptureRequest
-                //val controlMode = captureOptions.getCaptureRequestOption(CONTROL_MODE)
-                //val controlMode = captureOptions.getCaptureRequestOption(CONTROL_AE_MODE)
-                //val controlMode = captureOptions.getCaptureRequestOption(CONTROL_AF_MODE)
-                //val controlMode = captureOptions.getCaptureRequestOption(LENS_APERTURE)
-                //val controlMode = captureOptions.getCaptureRequestOption(SENSOR_SENSITIVITY)
-                //val controlMode = captureOptions.getCaptureRequestOption(TONEMAP_MODE)
-                //val controlMode = captureOptions.getCaptureRequestOption(SENSOR_EXPOSURE_TIME)
-                //val controlMode = captureOptions.getCaptureRequestOption(CONTROL_EFFECT_MODE)
-                val controlMode = captureOptions.getCaptureRequestOption(CONTROL_SCENE_MODE)
-                Log.v(TAG, "  Control Mode : $controlMode")
-
-                Log.v(TAG, "  -========-")
-                //return ("$controlMode")
-            }
-            val cameraInfo = cameraXCameraControl.getCamera2CameraInfo()
-            if (cameraInfo != null)
-            {
-                Log.v(TAG, "  ---  ---  ---")
-                val effect = cameraInfo.getCameraCharacteristic(CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS)
-                if (effect != null)
+                val controlMode = captureOptions.getCaptureRequestOption(CaptureRequest.CONTROL_MODE)
+                val sceneMode = captureOptions.getCaptureRequestOption(CaptureRequest.CONTROL_SCENE_MODE)
+                takeMode = when (controlMode?: 0) {
+                    CameraCharacteristics.CONTROL_MODE_OFF -> "OFF"
+                    CameraCharacteristics.CONTROL_MODE_AUTO -> "AUTO"
+                    CameraCharacteristics.CONTROL_MODE_USE_SCENE_MODE -> "SCENE"
+                    CameraCharacteristics.CONTROL_MODE_OFF_KEEP_STATE -> "OFF_KEEP"
+                    CameraCharacteristics.CONTROL_MODE_USE_EXTENDED_SCENE_MODE -> "exSCENE"
+                    else -> "($controlMode)"
+                }
+                val sceneText = when (sceneMode ?: 0)
                 {
-                    for (eValue in effect)
-                    {
-                        Log.v(TAG, "getTakeMode : $eValue")
-                    }
+                    CameraCharacteristics.CONTROL_SCENE_MODE_DISABLED -> "DISABLED"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_FACE_PRIORITY -> "FACE"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_ACTION -> "ACTION"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_PORTRAIT -> "PORTRAIT"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_LANDSCAPE -> "LANDSCAPE"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_NIGHT -> "NIGHT"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_NIGHT_PORTRAIT -> "NIGHT_PORTRAIT"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_THEATRE -> "THEATRE"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_BEACH -> "BEACH"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_SNOW -> "SNOW"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_SUNSET -> "SUNSET"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_STEADYPHOTO -> "STEADYPHOTO"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_FIREWORKS -> "FIREWORKS"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_SPORTS -> "SPORTS"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_PARTY -> "PARTY"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_CANDLELIGHT -> "CANDLELIGHT"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_BARCODE -> "BARCODE"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO -> "HS_VIDEO"
+                    CameraCharacteristics.CONTROL_SCENE_MODE_HDR -> "HDR"
+                    else -> "[$sceneMode]"
+                }
+                if ((controlMode == CameraCharacteristics.CONTROL_MODE_USE_SCENE_MODE)||(controlMode == CameraCharacteristics.CONTROL_MODE_USE_EXTENDED_SCENE_MODE))
+                {
+                    takeMode = sceneText
                 }
-                //val hwLevel = cameraInfo.getCameraCharacteristic(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)
-                //Log.v(TAG, "Hardware Level : $hwLevel")
-                //val orientation = cameraInfo.getCameraCharacteristic(CameraCharacteristics.SENSOR_ORIENTATION)
-                //Log.v(TAG, "Sensor Orientation : $orientation")
 
-                Log.v(TAG, "  ---  ---  ---")
+                if (isDumpStatus)
+                {
+                    dumpAvailableValuesIntArray("CONTROL_AF_AVAILABLE_MODES", CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES)
+                    dumpAvailableValuesIntArray("CONTROL_AVAILABLE_SCENE_MODES", CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES)
+                    dumpAvailableValuesIntArray("CONTROL_AVAILABLE_EFFECTS", CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS)
+                    dumpAvailableValuesIntArray("CONTROL_AWB_AVAILABLE_MODES", CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES)
+                    dumpAvailableValuesIntArray("NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES", CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES)
+                    dumpAvailableValuesIntArray("LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION", CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION)
+                    dumpAvailableValuesIntArray("REQUEST_AVAILABLE_CAPABILITIES", CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
+                    dumpAvailableValuesIntArray("TONEMAP_AVAILABLE_TONE_MAP_MODES", CameraCharacteristics.TONEMAP_AVAILABLE_TONE_MAP_MODES)
+                    dumpAvailableValuesIntArray("STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES", CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES)
+                    dumpAvailableValuesFloatArray("LENS_INFO_AVAILABLE_APERTURES", CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES)
+                    dumpAvailableValuesFloatArray("LENS_INFO_AVAILABLE_FILTER_DENSITIES", CameraCharacteristics.LENS_INFO_AVAILABLE_FILTER_DENSITIES)
+                    dumpAvailableValuesRangeLong("SENSOR_INFO_EXPOSURE_TIME_RANGE", CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE)
+                    dumpAvailableValuesRangeInt("SENSOR_INFO_SENSITIVITY_RANGE", CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE)
+                    dumpAvailableValuesRangeInt("CONTROL_AE_COMPENSATION_RANGE", CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE)
+                }
             }
         }
         catch (e : Exception)
         {
             e.printStackTrace()
         }
-*/
-        return ("")
+        return (takeMode)
     }
 
+    @SuppressLint("UnsafeOptInUsageError")
     private fun getShutterSpeed() : String
     {
-        return ("")
+        var exposureTime = ""
+        try
+        {
+            val cameraControl = cameraXCameraControl.getCamera2CameraControl()
+            if (cameraControl != null)
+            {
+                val captureOptions = cameraControl.captureRequestOptions
+                val exposure = captureOptions.getCaptureRequestOption(CaptureRequest.SENSOR_EXPOSURE_TIME) ?: 0
+                if (exposure != 0L)
+                {
+                    //  単位 : us → 秒に変換して文字列化
+                    exposureTime = convertShutterSpeedString((exposure.toDouble() / 1000000.0f))
+                }
+                //Log.v(TAG, " Exposure Time : $exposure [$exposureTime]")
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (exposureTime)
     }
 
+    @SuppressLint("UnsafeOptInUsageError")
     private fun getAperture() : String
     {
-        return ("")
+        var aperture = ""
+        try
+        {
+            val cameraControl = cameraXCameraControl.getCamera2CameraControl()
+            if (cameraControl != null)
+            {
+                val captureOptions = cameraControl.captureRequestOptions
+                // https://developer.android.com/reference/android/hardware/camera2/CaptureRequest
+                val lensAperture = captureOptions.getCaptureRequestOption(CaptureRequest.LENS_APERTURE) ?: 0.0f
+                if (lensAperture != 0.0f)
+                {
+                    aperture = String.format("F%2.1f", lensAperture)
+                }
+                // Log.v(TAG, " Aperture : $lensAperture")
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (aperture)
     }
 
     private fun getExpRev() : String
@@ -131,29 +195,154 @@ class CameraXCameraStatusHolder(private val cameraXCameraControl: CameraXCameraC
         return ("")
     }
 
+    @SuppressLint("UnsafeOptInUsageError")
     private fun getCaptureMode() : String
     {
-        return ("")
+        var focalLength = ""
+        try
+        {
+            val cameraControl = cameraXCameraControl.getCamera2CameraControl()
+            if (cameraControl != null)
+            {
+                val captureOptions = cameraControl.captureRequestOptions
+                // https://developer.android.com/reference/android/hardware/camera2/CaptureRequest
+                val focal = captureOptions.getCaptureRequestOption(CaptureRequest.LENS_FOCAL_LENGTH) ?: 0.0f
+                if (focal != 0.0f)
+                {
+                    focalLength = String.format("F%2.1fmm", focal)
+                }
+                // Log.v(TAG, " Focal Length : $focalLength")
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (focalLength)
     }
 
+    @SuppressLint("UnsafeOptInUsageError")
     private fun getIsoSensitivity() : String
     {
-        return ("")
+        var isoSensitivity = ""
+        try
+        {
+            val cameraControl = cameraXCameraControl.getCamera2CameraControl()
+            if (cameraControl != null)
+            {
+                val captureOptions = cameraControl.captureRequestOptions
+                val sensitivity = captureOptions.getCaptureRequestOption(CaptureRequest.SENSOR_SENSITIVITY) ?: 0
+                if (sensitivity != 0)
+                {
+                    isoSensitivity = String.format("ISO:%d", sensitivity)
+                }
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (isoSensitivity)
     }
 
+    @SuppressLint("UnsafeOptInUsageError")
     private fun getWhiteBalance() : String
     {
-        return ("")
+        var wb = ""
+        try
+        {
+            val cameraControl = cameraXCameraControl.getCamera2CameraControl()
+            if (cameraControl != null)
+            {
+                val captureOptions = cameraControl.captureRequestOptions
+                val awbMode = captureOptions.getCaptureRequestOption(CaptureRequest.CONTROL_AWB_MODE) ?: 0
+                val colorCorrection = captureOptions.getCaptureRequestOption(CaptureRequest.COLOR_CORRECTION_MODE) ?: 0
+                wb = when (awbMode) {
+                    CameraCharacteristics.CONTROL_AWB_MODE_OFF -> ""
+                    CameraCharacteristics.CONTROL_AWB_MODE_AUTO -> "WB:AUTO"
+                    CameraCharacteristics.CONTROL_AWB_MODE_INCANDESCENT -> "WB:INCANDESCENT"
+                    CameraCharacteristics.CONTROL_AWB_MODE_FLUORESCENT -> "WB:FLUORESCENT"
+                    CameraCharacteristics.CONTROL_AWB_MODE_WARM_FLUORESCENT -> "WB:WARM FLUORESCENT"
+                    CameraCharacteristics.CONTROL_AWB_MODE_DAYLIGHT -> "WB:DAYLIGHT"
+                    CameraCharacteristics.CONTROL_AWB_MODE_CLOUDY_DAYLIGHT -> "WB:CLOUDY DAYLIGHT"
+                    CameraCharacteristics.CONTROL_AWB_MODE_TWILIGHT -> "WB:TWILIGHT"
+                    CameraCharacteristics.CONTROL_AWB_MODE_SHADE -> "WB:SHADE"
+                    else -> "WB:[$awbMode]"
+                }
+                if (awbMode == CameraCharacteristics.CONTROL_AWB_MODE_OFF)
+                {
+                    wb = when (colorCorrection) {
+                        CameraCharacteristics.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX -> "wb:MATRIX"
+                        CameraCharacteristics.COLOR_CORRECTION_MODE_FAST -> "wb:FAST"
+                        CameraCharacteristics.COLOR_CORRECTION_MODE_HIGH_QUALITY -> "wb:HQ"
+                        else -> "WB:[$awbMode/$colorCorrection]"
+                    }
+                }
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (wb)
     }
 
+    @SuppressLint("UnsafeOptInUsageError")
     private fun getMeteringMode() : String
     {
-        return ("")
+        var aeMode = ""
+        try
+        {
+            val cameraControl = cameraXCameraControl.getCamera2CameraControl()
+            if (cameraControl != null)
+            {
+                val captureOptions = cameraControl.captureRequestOptions
+                val autoExposure = captureOptions.getCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE) ?: 0
+                aeMode = when (autoExposure) {
+                    CameraCharacteristics.CONTROL_AE_MODE_OFF -> "AE:OFF"
+                    CameraCharacteristics.CONTROL_AE_MODE_ON -> ""
+                    CameraCharacteristics.CONTROL_AE_MODE_ON_AUTO_FLASH -> "Flash"
+                    CameraCharacteristics.CONTROL_AE_MODE_ON_ALWAYS_FLASH -> "FLASH ON"
+                    CameraCharacteristics.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE -> "Flash(RedEye)"
+                    CameraCharacteristics.CONTROL_AE_MODE_ON_EXTERNAL_FLASH -> "FLASH:EXTERNAL"
+                    else -> "FLASH:[$autoExposure]"
+                }
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (aeMode)
     }
 
+    @SuppressLint("UnsafeOptInUsageError")
     private fun getPictureEffect() : String
     {
-        return ("")
+        var effect = ""
+        try
+        {
+            val cameraControl = cameraXCameraControl.getCamera2CameraControl()
+            if (cameraControl != null)
+            {
+                val captureOptions = cameraControl.captureRequestOptions
+                val aeLock = captureOptions.getCaptureRequestOption(CaptureRequest.CONTROL_AE_LOCK) ?: false
+                val awbLock = captureOptions.getCaptureRequestOption(CaptureRequest.CONTROL_AWB_LOCK) ?: false
+                if (aeLock)
+                {
+                    effect = "$effect AE-L"
+                }
+                if (awbLock)
+                {
+                    effect = "$effect WB-L"
+                }
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (effect)
     }
 
 
@@ -162,7 +351,6 @@ class CameraXCameraStatusHolder(private val cameraXCameraControl: CameraXCameraC
     {
         try
         {
-
             val cameraInfo = cameraXCameraControl.getCamera2CameraInfo()
             if (cameraInfo != null)
             {
@@ -177,4 +365,140 @@ class CameraXCameraStatusHolder(private val cameraXCameraControl: CameraXCameraC
         return ("")
     }
 
+    @SuppressLint("UnsafeOptInUsageError")
+    private fun dumpAvailableValuesIntArray(name : String, id: CameraCharacteristics.Key<IntArray>)
+    {
+        try
+        {
+            val cameraInfo = cameraXCameraControl.getCamera2CameraInfo()
+            if (cameraInfo != null)
+            {
+                Log.v(TAG, "  -----  $name  -----")
+                val selection = cameraInfo.getCameraCharacteristic(id)
+                if (selection != null)
+                {
+                    for (value in selection)
+                    {
+                        Log.v(TAG, "    $value")
+                    }
+                }
+                Log.v(TAG, "  -----  $name  -----")
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    private fun convertShutterSpeedString(shutterSpeed : Double) : String
+    {
+        var inv = 0.0
+        var stringValue = ""
+        try
+        {
+            if (shutterSpeed  < 1.0)
+            {
+                inv = 1.0 / shutterSpeed
+            }
+            if (inv < 2.0) // if (inv < 10.0)
+            {
+                inv = 0.0
+            }
+            if (inv > 0.0f)
+            {
+                // シャッター速度を分数で表示する
+                var intValue = inv.toInt()
+                val modValue = intValue % 10
+                if (modValue == 9 || modValue == 4)
+                {
+                    // ちょっと格好が悪いけど...切り上げ
+                    intValue++
+                }
+                stringValue = "1/$intValue"
+            }
+            else
+            {
+                // シャッター速度を数値(秒数)で表示する
+                stringValue = "${shutterSpeed}s "
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (stringValue)
+    }
+
+    @SuppressLint("UnsafeOptInUsageError")
+    private fun dumpAvailableValuesFloatArray(name : String, id: CameraCharacteristics.Key<FloatArray>)
+    {
+        try
+        {
+            val cameraInfo = cameraXCameraControl.getCamera2CameraInfo()
+            if (cameraInfo != null)
+            {
+                Log.v(TAG, "  -----  $name  -----")
+                val selection = cameraInfo.getCameraCharacteristic(id)
+                if (selection != null)
+                {
+                    for (value in selection)
+                    {
+                        Log.v(TAG, "    $value")
+                    }
+                }
+                Log.v(TAG, "  -----  $name  -----")
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    @SuppressLint("UnsafeOptInUsageError")
+    private fun dumpAvailableValuesRangeLong(name : String, id: CameraCharacteristics.Key<Range<Long>>)
+    {
+        try
+        {
+            val cameraInfo = cameraXCameraControl.getCamera2CameraInfo()
+            if (cameraInfo != null)
+            {
+                Log.v(TAG, "  -----  $name  -----")
+                val selection = cameraInfo.getCameraCharacteristic(id)
+                if (selection != null)
+                {
+                    Log.v(TAG, "    lower: ${selection.lower}  upper: ${selection.upper}")
+                }
+                Log.v(TAG, "  -----  $name  -----")
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    @SuppressLint("UnsafeOptInUsageError")
+    private fun dumpAvailableValuesRangeInt(name : String, id: CameraCharacteristics.Key<Range<Int>>)
+    {
+        try
+        {
+            val cameraInfo = cameraXCameraControl.getCamera2CameraInfo()
+            if (cameraInfo != null)
+            {
+                Log.v(TAG, "  -----  $name  -----")
+                val selection = cameraInfo.getCameraCharacteristic(id)
+                if (selection != null)
+                {
+                    Log.v(TAG, "    lower: ${selection.lower} upper: ${selection.upper}")
+                }
+                Log.v(TAG, "  -----  $name  -----")
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
 }