From 38f87df5c942f65e2eb74f255c72fb6a432b2256 Mon Sep 17 00:00:00 2001 From: yuqian Date: Thu, 25 Dec 2025 10:05:42 +0800 Subject: [PATCH] =?UTF-8?q?camera=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../custom/SetNumberOrWordUtils.kt | 32 +++++ .../myphoneinfo/custom/SetNumberUtils.kt | 10 -- .../myphoneinfo/dashboard/CameraFragment.kt | 27 +++- .../myphoneinfo/dialog/DialogCameraMore.kt | 130 +++++++++++++++++- .../main/res/layout/common_dialog_item.xml | 7 +- .../main/res/layout/common_sensor_style.xml | 9 +- .../main/res/layout/dialog_camera_more.xml | 57 ++++---- .../src/main/res/layout/fragment_camera.xml | 3 +- .../src/main/res/layout/fragment_sensors.xml | 2 +- myphoneinfo/src/main/res/values/strings.xml | 7 + 10 files changed, 223 insertions(+), 61 deletions(-) create mode 100644 myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt delete mode 100644 myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberUtils.kt diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt new file mode 100644 index 0000000..9d9d8bf --- /dev/null +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt @@ -0,0 +1,32 @@ +package com.xyzshell.myphoneinfo.custom + +object SetNumberOrWordUtils { + fun setDecimal1(double: Double): String{ + return "%.1f".format(double) + } + fun setDecimal0(double: Double): String{ + return double.toInt().toString() + } + + fun toTitleCase(sentence: String): String { + if (sentence.isEmpty()) return "" + + val words = sentence.trim().split("\\s+".toRegex()) // 按一个或多个空格分割 + + return if (words.isNotEmpty()) { + // 第一个单词首字母大写 + val firstWord = words[0].lowercase().replaceFirstChar { it.uppercase() } + + // 其余单词保持小写 + val remainingWords = words.drop(1).joinToString(" ") { it.lowercase() } + + if (remainingWords.isNotEmpty()) { + "$firstWord $remainingWords" + } else { + firstWord + } + } else { + "" + } + } +} \ No newline at end of file diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberUtils.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberUtils.kt deleted file mode 100644 index e67e60d..0000000 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberUtils.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.xyzshell.myphoneinfo.custom - -object SetNumberUtils { - fun setDecimal1(double: Double): String{ - return "%.1f".format(double) - } - fun setDecimal0(double: Double): String{ - return double.toInt().toString() - } -} \ No newline at end of file diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt index 4cb1e36..1ef761d 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt @@ -1,23 +1,22 @@ package com.xyzshell.myphoneinfo.dashboard +import android.hardware.camera2.CameraCharacteristics import android.os.Bundle +import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.compose.material3.Text -import androidx.fragment.app.FragmentContainer -import com.google.android.material.textview.MaterialTextView import com.xyzshell.andinfo.AndInfo import com.xyzshell.myphoneinfo.R -import com.xyzshell.myphoneinfo.custom.SetNumberUtils.setDecimal0 -import com.xyzshell.myphoneinfo.custom.SetNumberUtils.setDecimal1 +import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal0 +import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal1 import com.xyzshell.myphoneinfo.databinding.FragmentCameraBinding import com.xyzshell.myphoneinfo.databinding.ItemCameraTypeBinding import com.xyzshell.myphoneinfo.dialog.DialogCameraMore class CameraFragment : Fragment() { - private lateinit var binding:FragmentCameraBinding; + private lateinit var binding:FragmentCameraBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -66,6 +65,20 @@ class CameraFragment : Fragment() { } itemBinding.titleCon.text = cameraName + //取第一个相机的视频帧率 + if(index==0){ + cameraInfo.getMaxFrameRate(it).let { maxFrameRate-> + binding.video.textTitle.text=getString(R.string.max_frequency) + binding.video.textContent.text=maxFrameRate.toString()+"HZ" + } + cameraInfo.supportsHighSpeedVideo(it).let { hasHighSpeedVideo -> + binding.videoCheck1.image.isSelected=hasHighSpeedVideo + } + cameraInfo.hasVideoStabilization(it).let { hasVideoStabilization -> + binding.videoCheck2.image.isSelected=hasVideoStabilization + } + } + // 4. 设置详细信息(使用 include 的文本) @@ -125,6 +138,7 @@ class CameraFragment : Fragment() { itemBinding.rearCheck2.image.isSelected=hasFlash } + // 6. 设置"更多"按钮点击事件 itemBinding.rearMore.setOnClickListener { var dialogCamera0: DialogCameraMore? = null @@ -142,6 +156,7 @@ class CameraFragment : Fragment() { binding.videoCheck1.content.text=getString(R.string.hight_speed_video) binding.videoCheck2.content.text=getString(R.string.video_stabilization) + } companion object { diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCameraMore.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCameraMore.kt index 687f79e..4c8fa00 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCameraMore.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCameraMore.kt @@ -1,14 +1,14 @@ package com.xyzshell.myphoneinfo.dialog -import android.graphics.Typeface import android.os.Bundle -import android.text.SpannableString -import android.text.style.StyleSpan import android.view.View +import com.xyzshell.andinfo.AndInfo import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.base.BaseDialogFragment +import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal0 +import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal1 +import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.toTitleCase import com.xyzshell.myphoneinfo.databinding.DialogCameraMoreBinding -import com.xyzshell.myphoneinfo.databinding.DialogCpuInfoBinding class DialogCameraMore(private val name:String,private val id:String) :BaseDialogFragment(DialogCameraMoreBinding::inflate){ override fun getTitle(): String = name @@ -19,6 +19,128 @@ class DialogCameraMore(private val name:String,private val id:String) :BaseDialo override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val cameraInfo = AndInfo.instance.camera + if(!id.isEmpty()){ + id.forEachIndexed { index, cameraId -> + val characteristics = cameraInfo.getCameraCharacteristics(id) + characteristics?.let { + // 设置详细信息(使用 include 的文本) + // 设置百万像素 + + cameraInfo.getMegaPixels(it)?.let { size -> + binding.tv1.setValue("${setDecimal1(size)} MP") + } + //像素阵列大小 + cameraInfo.getPixelArraySize(it)?.let { size -> + binding.tv2.setValue(size) + + } + // 传感器物理尺寸 + cameraInfo.getSensorPhysicalSize(it)?.let { size -> + binding.tv3.setValue(size) + } + // 传感器px尺寸 + cameraInfo.getPixelSize(it)?.let { size -> + binding.tv4.setValue("${setDecimal0(size)}μm") + } + // 颜色排列 + cameraInfo.getColorFilterArrangement(it)?.let { size -> + binding.tv5.setValue(size) + } + //光圈值 + cameraInfo.getAvailableApertures(it)?.let { apertures -> + if (apertures.isNotEmpty()) { + binding.tv6.setValue("f/${apertures[0]}") + } + } + //焦距 + cameraInfo.getFocalLength(it)?.let { apertures -> + if (apertures.isNotEmpty()) { + binding.tv7.setValue(apertures[0].toString()) + } + } + + // 35mm等效焦距 + cameraInfo.getFocal35mmEquivalent(it)?.let { size -> + binding.tv8.setValue("${size.toInt()}mm") + } + // 裁切系数 + cameraInfo.getFocal35mmEquivalent(it)?.let { size -> + binding.tv9.setValue("${size.toInt()}x") + } + // 快门速度 + cameraInfo.getShutterSpeedRange(it)?.let { size -> + binding.tv11.setValue(size) + } + + // ISO感光范围 + cameraInfo.getIsoRange(it)?.let { size -> + binding.tv12.setValue(size.lower.toString() + " - " + size.upper.toString()) + } + + // 闪光灯 + binding.check1.content.text=getString(R.string.flash) + cameraInfo.hasFlashUnit(it)?.let { hasFlash -> + binding.check1.image.isSelected=hasFlash + } + // 视频防抖 + binding.check2.content.text=getString(R.string.video_stabilization) + cameraInfo.hasVideoStabilization(it)?.let { hasVideoStabilization -> + binding.check2.image.isSelected=hasVideoStabilization + } + // 光学防抖 + binding.check3.content.text=getString(R.string.optical_image_stabilization) + cameraInfo.hasOpticalStabilization(it).let { hasOpticalStabilization -> + binding.check3.image.isSelected = hasOpticalStabilization + } + // 曝光锁定 + // 曝光模式 + binding.check4.content.text=getString(R.string.ae_lock) + cameraInfo.getAutoExposureModes(it)?.let { list -> + val allInfo=list.joinToString(" , ") { mode -> mode} + binding.check4.image.isSelected=list.size>2 + binding.more2.text=allInfo + } + // 白平衡锁定 + // 白平衡模式 + binding.check5.content.text=getString(R.string.wb_lock) + cameraInfo.getWhiteBalanceModes(it)?.let { list -> + binding.check5.image.isSelected=list.size>2 + val allInfo=list.joinToString(" , ") { mode -> mode} + binding.more4.text=allInfo + } + + + //功能 + cameraInfo.getAvailableCapabilities(it).let{ capabilities -> + val allCapabilities = capabilities.joinToString(",") { capability -> + toTitleCase(capability.name.replace("_", " ")) + } + binding.more1.text=allCapabilities + } + //自动对焦模式 + cameraInfo.getAvailableCapabilities(it).let{ capabilities -> + val allInfo=capabilities.joinToString(" , ") { capability -> + toTitleCase(capability.name.replace("_", " ")) + } + binding.more3.text=allInfo + } + + //场景模式 + cameraInfo.getSceneModes(it).let{ capabilities -> + val allInfo=capabilities?.joinToString(" , ") { capability -> + toTitleCase(capability.replace("_", " ")) + } + binding.more5.text=allInfo + binding.tv10.setValue(capabilities?.get(0) ?: "") + } + + + + + } + } + } } override fun onNegativeClick() { diff --git a/myphoneinfo/src/main/res/layout/common_dialog_item.xml b/myphoneinfo/src/main/res/layout/common_dialog_item.xml index 93687e2..d8ede61 100644 --- a/myphoneinfo/src/main/res/layout/common_dialog_item.xml +++ b/myphoneinfo/src/main/res/layout/common_dialog_item.xml @@ -18,17 +18,17 @@ \ No newline at end of file diff --git a/myphoneinfo/src/main/res/layout/common_sensor_style.xml b/myphoneinfo/src/main/res/layout/common_sensor_style.xml index 5434369..6fceed5 100644 --- a/myphoneinfo/src/main/res/layout/common_sensor_style.xml +++ b/myphoneinfo/src/main/res/layout/common_sensor_style.xml @@ -4,7 +4,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:paddingHorizontal="18dp" android:paddingVertical="15dp" - android:layout_marginVertical="8dp" + android:layout_marginVertical="5dp" android:background="@drawable/dashboard_model_background" android:layout_height="wrap_content"> diff --git a/myphoneinfo/src/main/res/layout/dialog_camera_more.xml b/myphoneinfo/src/main/res/layout/dialog_camera_more.xml index 3827ac4..c0c5b19 100644 --- a/myphoneinfo/src/main/res/layout/dialog_camera_more.xml +++ b/myphoneinfo/src/main/res/layout/dialog_camera_more.xml @@ -94,16 +94,14 @@ style="@style/LeftContent" android:layout_width="150dp" android:layout_height="wrap_content" - android:text="Capabilities" - android:textSize="15sp" - android:textStyle="bold" /> + android:text="@string/capabilities" /> + android:textColor="@color/right_color" /> + android:text="@string/exposure_modes" /> + android:textColor="@color/right_color" /> + android:text="@string/autofocus_modes" /> + android:textColor="@color/right_color" + /> + android:text="@string/white_balance_modes" + /> + android:textColor="@color/right_color" + /> + android:text="@string/scene_modes" + /> + android:textColor="@color/right_color" + /> diff --git a/myphoneinfo/src/main/res/layout/fragment_camera.xml b/myphoneinfo/src/main/res/layout/fragment_camera.xml index 200bf07..56e001f 100644 --- a/myphoneinfo/src/main/res/layout/fragment_camera.xml +++ b/myphoneinfo/src/main/res/layout/fragment_camera.xml @@ -85,10 +85,11 @@ diff --git a/myphoneinfo/src/main/res/layout/fragment_sensors.xml b/myphoneinfo/src/main/res/layout/fragment_sensors.xml index 10e118a..7f3f183 100644 --- a/myphoneinfo/src/main/res/layout/fragment_sensors.xml +++ b/myphoneinfo/src/main/res/layout/fragment_sensors.xml @@ -20,7 +20,7 @@ diff --git a/myphoneinfo/src/main/res/values/strings.xml b/myphoneinfo/src/main/res/values/strings.xml index 4fa79d7..d47a71c 100644 --- a/myphoneinfo/src/main/res/values/strings.xml +++ b/myphoneinfo/src/main/res/values/strings.xml @@ -293,4 +293,11 @@ Toybox Java VM current + AE lock + WB lock + White balance modes + Capabilities + Exposure modes + Autofocus modes + Scene modes \ No newline at end of file