camera相关接口完成

This commit is contained in:
yuqian 2025-12-25 10:05:42 +08:00
parent a7a0d45d9b
commit 38f87df5c9
10 changed files with 223 additions and 61 deletions

View File

@ -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 {
""
}
}
}

View File

@ -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()
}
}

View File

@ -1,23 +1,22 @@
package com.xyzshell.myphoneinfo.dashboard package com.xyzshell.myphoneinfo.dashboard
import android.hardware.camera2.CameraCharacteristics
import android.os.Bundle import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup 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.andinfo.AndInfo
import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.R
import com.xyzshell.myphoneinfo.custom.SetNumberUtils.setDecimal0 import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal0
import com.xyzshell.myphoneinfo.custom.SetNumberUtils.setDecimal1 import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal1
import com.xyzshell.myphoneinfo.databinding.FragmentCameraBinding import com.xyzshell.myphoneinfo.databinding.FragmentCameraBinding
import com.xyzshell.myphoneinfo.databinding.ItemCameraTypeBinding import com.xyzshell.myphoneinfo.databinding.ItemCameraTypeBinding
import com.xyzshell.myphoneinfo.dialog.DialogCameraMore import com.xyzshell.myphoneinfo.dialog.DialogCameraMore
class CameraFragment : Fragment() { class CameraFragment : Fragment() {
private lateinit var binding:FragmentCameraBinding; private lateinit var binding:FragmentCameraBinding
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -66,6 +65,20 @@ class CameraFragment : Fragment() {
} }
itemBinding.titleCon.text = cameraName 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 的文本) // 4. 设置详细信息(使用 include 的文本)
@ -125,6 +138,7 @@ class CameraFragment : Fragment() {
itemBinding.rearCheck2.image.isSelected=hasFlash itemBinding.rearCheck2.image.isSelected=hasFlash
} }
// 6. 设置"更多"按钮点击事件 // 6. 设置"更多"按钮点击事件
itemBinding.rearMore.setOnClickListener { itemBinding.rearMore.setOnClickListener {
var dialogCamera0: DialogCameraMore? = null var dialogCamera0: DialogCameraMore? = null
@ -142,6 +156,7 @@ class CameraFragment : Fragment() {
binding.videoCheck1.content.text=getString(R.string.hight_speed_video) binding.videoCheck1.content.text=getString(R.string.hight_speed_video)
binding.videoCheck2.content.text=getString(R.string.video_stabilization) binding.videoCheck2.content.text=getString(R.string.video_stabilization)
} }
companion object { companion object {

View File

@ -1,14 +1,14 @@
package com.xyzshell.myphoneinfo.dialog package com.xyzshell.myphoneinfo.dialog
import android.graphics.Typeface
import android.os.Bundle import android.os.Bundle
import android.text.SpannableString
import android.text.style.StyleSpan
import android.view.View import android.view.View
import com.xyzshell.andinfo.AndInfo
import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.R
import com.xyzshell.myphoneinfo.base.BaseDialogFragment 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.DialogCameraMoreBinding
import com.xyzshell.myphoneinfo.databinding.DialogCpuInfoBinding
class DialogCameraMore(private val name:String,private val id:String) :BaseDialogFragment<DialogCameraMoreBinding>(DialogCameraMoreBinding::inflate){ class DialogCameraMore(private val name:String,private val id:String) :BaseDialogFragment<DialogCameraMoreBinding>(DialogCameraMoreBinding::inflate){
override fun getTitle(): String = name 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?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) 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() { override fun onNegativeClick() {

View File

@ -18,17 +18,17 @@
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/tv_label" android:id="@+id/tv_label"
style="@style/TextDialogLabel" style="@style/LeftContent"
android:layout_width="120dp" android:layout_width="120dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/tv_sub_title" android:layout_below="@id/tv_sub_title"
android:gravity="start" android:gravity="start"
android:textSize="15sp" android:textSize="14sp"
android:text="sppppppppppppppppppppp" /> android:text="sppppppppppppppppppppp" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/tv_value" android:id="@+id/tv_value"
style="@style/TextDialogContent" style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignTop="@id/tv_label" android:layout_alignTop="@id/tv_label"
@ -36,6 +36,7 @@
android:layout_toEndOf="@id/tv_label" android:layout_toEndOf="@id/tv_label"
android:gravity="center" android:gravity="center"
android:textSize="15sp" android:textSize="15sp"
android:textColor="#C1C5C2"
android:text="sppppppppppppppppppppp" /> android:text="sppppppppppppppppppppp" />
</RelativeLayout> </RelativeLayout>

View File

@ -4,7 +4,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:paddingHorizontal="18dp" android:paddingHorizontal="18dp"
android:paddingVertical="15dp" android:paddingVertical="15dp"
android:layout_marginVertical="8dp" android:layout_marginVertical="5dp"
android:background="@drawable/dashboard_model_background" android:background="@drawable/dashboard_model_background"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<LinearLayout <LinearLayout
@ -16,18 +16,19 @@
> >
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/sensor_name" android:id="@+id/sensor_name"
style="@style/TextTool25" style="@style/TextHeavy20"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textStyle="normal" android:textSize="18sp"
android:gravity="start" android:gravity="start"
android:text="spppppppeee" /> android:text="spppppppeee" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/sensor_value" android:id="@+id/sensor_value"
style="@style/TextContentRight" style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="start" android:gravity="start"
android:textColor="@color/right_color"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:text="spppppppeee" /> android:text="spppppppeee" />
</LinearLayout> </LinearLayout>

View File

@ -94,16 +94,14 @@
style="@style/LeftContent" style="@style/LeftContent"
android:layout_width="150dp" android:layout_width="150dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Capabilities" android:text="@string/capabilities" />
android:textSize="15sp"
android:textStyle="bold" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
style="@style/TextContentRight" android:id="@+id/more1"
style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="High speed video" android:textColor="@color/right_color" />
android:textSize="15sp" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -115,16 +113,14 @@
style="@style/LeftContent" style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Exposure modes" android:text="@string/exposure_modes" />
android:textSize="15sp"
android:textStyle="bold" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
style="@style/TextContentRight" android:id="@+id/more2"
style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Manual, Auto, Flash" android:textColor="@color/right_color" />
android:textSize="15sp" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -136,18 +132,15 @@
style="@style/LeftContent" style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Autofocus modes" android:text="@string/autofocus_modes" />
android:textSize="15sp"
android:textStyle="bold" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
style="@style/TextContentRight" android:id="@+id/more3"
style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Manual, Auto, Macro, android:textColor="@color/right_color"
Continuous video, Continuous />
picture"
android:textSize="15sp" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -159,16 +152,16 @@ picture"
style="@style/LeftContent" style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="White balance modes" android:text="@string/white_balance_modes"
android:textSize="15sp" />
android:textStyle="bold" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
style="@style/TextContentRight" android:id="@+id/more4"
style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Auto, Off, Incandescent,Fluorescent, Daylight, Cloudy" android:textColor="@color/right_color"
android:textSize="15sp" /> />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -180,16 +173,16 @@ picture"
style="@style/LeftContent" style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Scene modes" android:text="@string/scene_modes"
android:textSize="15sp" />
android:textStyle="bold" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
style="@style/TextContentRight" android:id="@+id/more5"
style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Face priority, Action, Portrait,Landscape, Night, Nightportrait, Theatre, Beach,Snow, Fireworks, Candlelight,High speed video" android:textColor="@color/right_color"
android:textSize="15sp" /> />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -85,10 +85,11 @@
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/open2" android:id="@+id/open2"
style="@style/TextContentRight" style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/apps" android:text="@string/apps"
android:textColor="@color/right_color"
tools:ignore="RelativeOverlap" /> tools:ignore="RelativeOverlap" />
</LinearLayout> </LinearLayout>
<include layout="@layout/common_text_style" android:id="@+id/video"/> <include layout="@layout/common_text_style" android:id="@+id/video"/>

View File

@ -20,7 +20,7 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:visibility="visible" android:visibility="gone"
android:orientation="vertical"> android:orientation="vertical">
<include layout="@layout/common_sensor_style" android:id="@+id/sensor1"/> <include layout="@layout/common_sensor_style" android:id="@+id/sensor1"/>
<include layout="@layout/common_sensor_style" android:id="@+id/sensor2"/> <include layout="@layout/common_sensor_style" android:id="@+id/sensor2"/>

View File

@ -293,4 +293,11 @@
<string name="toybox">Toybox</string> <string name="toybox">Toybox</string>
<string name="java_VM">Java VM</string> <string name="java_VM">Java VM</string>
<string name="current">current</string> <string name="current">current</string>
<string name="ae_lock">AE lock</string>
<string name="wb_lock">WB lock</string>
<string name="white_balance_modes">White balance modes</string>
<string name="capabilities">Capabilities</string>
<string name="exposure_modes">Exposure modes</string>
<string name="autofocus_modes">Autofocus modes</string>
<string name="scene_modes">Scene modes</string>
</resources> </resources>