diff --git a/README.md b/README.md new file mode 100644 index 0000000..fa6097d --- /dev/null +++ b/README.md @@ -0,0 +1,67 @@ +## 获取 CPU 信息 +val cpuInfo = AndInfo.instance.cpu + +## 获取设备信息 +val deviceInfo = AndInfo.instance.device + +## 获取显示信息 +val displayInfo = AndInfo.instance.display + +## 获取传感器信息 +val sensorInfo = AndInfo.instance.sensor + +## 获取系统构建信息 +val buildInfo = AndInfo.instance.build + +## 获取 GPU 信息 +val gpuInfo = AndInfo.instance.gpu + +## 获取输入设备信息 +val inputInfo = AndInfo.instance.input + +## 获取摄像头信息 +val cameraInfo = AndInfo.instance.camera + +## 获取蓝牙信息 +val bluetoothInfo = AndInfo.instance.bluetooth + +## 获取存储信息 +val storageInfo = AndInfo.instance.storage + +## 获取应用信息 +val appInfo = AndInfo.instance.app.getInstalledApps() + + +权限 + +Permission: android.permission.POST_NOTIFICATIONS, Description: 允许该应用显示通知 +Permission: android.permission.ACCESS_COARSE_LOCATION, Description: 当您使用此应用时,此应用可以通过位置信息服务获取您的大致位置信息。您必须开启设备的位置信息服务,此应用才能获取位置信息。 +Permission: com.android.vending.BILLING, Description: 允许用户在此应用中通过 Google Play 购买商品。 +Permission: android.permission.BLUETOOTH, Description: 允许该应用查看手机上的蓝牙配置,以及与配对设备建立连接或接受其连接请求。 +Permission: android.permission.BLUETOOTH_ADMIN, Description: 允许应用配置本地蓝牙手机,并允许其查找远程设备且与之配对。 +Permission: android.permission.BLUETOOTH_CONNECT, Description: 允许该应用连接到已配对的蓝牙设备 +Permission: android.permission.BLUETOOTH_SCAN, Description: 允许该应用发现附近的蓝牙设备并与其配对 +Permission: android.permission.TRANSMIT_IR, Description: 允许应用使用手机的红外线发射器。 +Permission: android.permission.READ_PHONE_STATE, Description: 允许该应用访问设备的电话功能。此权限可让该应用确定本机号码和设备 ID、是否正处于通话状态以及拨打的号码。 +Permission: android.permission.INTERNET, Description: 允许该应用创建网络套接字和使用自定义网络协议。浏览器和其他某些应用提供了向互联网发送数据的途径,因此应用无需该权限即可向互联网发送数据。 +Permission: android.permission.ACCESS_NETWORK_STATE, Description: 允许该应用查看网络连接的相关信息,例如存在和连接的网络。 +Permission: android.permission.ACCESS_WIFI_STATE, Description: 允许该应用查看 WLAN 网络的相关信息,例如是否启用了 WLAN 以及连接的 WLAN 设备的名称。 +Permission: android.permission.VIBRATE, Description: 允许应用控制振动器。 +Permission: android.permission.BATTERY_STATS, Description: No description available +Permission: android.permission.DUMP, Description: No description available +Permission: android.permission.PACKAGE_USAGE_STATS, Description: No description available +Permission: android.permission.RECORD_AUDIO, Description: 当您使用此应用时,它可以使用麦克风录音。 +Permission: android.permission.CHANGE_WIFI_STATE, Description: 允许该应用与WLAN接入点建立和断开连接,以及更改WLAN网络的设备配置。 +Permission: android.permission.ACCESS_FINE_LOCATION, Description: 当您使用此应用时,此应用可以通过位置信息服务获取您的确切位置信息。您必须开启设备的位置信息服务,此应用才能获取位置信息。这可能会增加耗电量。 +Permission: com.google.android.providers.gsf.permission.READ_GSERVICES, Description: 允许此应用读取 Google 服务配置数据。 +Permission: android.permission.RECEIVE_BOOT_COMPLETED, Description: 允许应用在系统完成引导后立即自动启动。这样可能会延长手机的启动时间,并允许应用始终运行,从而导致手机总体运行速度减慢。 +Permission: android.permission.CAMERA, Description: 当您使用此应用时,它可以使用相机拍摄照片和录制视频。 +Permission: android.permission.FOREGROUND_SERVICE, Description: 允许该应用使用前台服务。 +Permission: android.permission.REQUEST_DELETE_PACKAGES, Description: 允许应用请求删除文件包。 +Permission: android.permission.QUERY_ALL_PACKAGES, Description: 允许应用查看所有已安装的软件包。 +Permission: android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, Description: 允许应用请求相应的权限,以便忽略针对该应用的电池优化。 +Permission: android.permission.WAKE_LOCK, Description: 允许应用阻止手机进入休眠状态。 +Permission: android.permission.SYSTEM_ALERT_WINDOW, Description: 此应用可显示在其他应用上方或屏幕的其他部分。这可能会妨碍您正常地使用应用,且其他应用的显示方式可能会受到影响。 +Permission: android.permission.FOREGROUND_SERVICE_SPECIAL_USE, Description: 允许该应用使用“specialUse”类型的前台服务 +Permission: android.permission.USE_BIOMETRIC, Description: 允许该应用使用生物特征硬件进行身份验证 +Permission: android.permission.USE_FINGERPRINT, Description: 允许该应用使用指纹硬件进行身份验证 \ No newline at end of file diff --git a/myphoneinfo/andinfo/src/main/AndroidManifest.xml b/myphoneinfo/andinfo/src/main/AndroidManifest.xml index 66bb195..5543ce2 100644 --- a/myphoneinfo/andinfo/src/main/AndroidManifest.xml +++ b/myphoneinfo/andinfo/src/main/AndroidManifest.xml @@ -1,11 +1,44 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/BatteryInfo.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/BatteryInfo.kt new file mode 100644 index 0000000..b9fabca --- /dev/null +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/BatteryInfo.kt @@ -0,0 +1,101 @@ +package com.xyzshell.andinfo.libs + +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.BatteryManager + +data class BatteryDetails( + val percentage: Int, // 0-100 电池百分比 + val isCharging: Boolean, // 是否正在充电 + val currentNow: Int?, // in mA 当前电流 + val powerUsage: Double?, // in W 功率消耗 + val temperature: Double, // in Celsius 温度 摄氏度 + val health: String, // 健康状态 + val voltage: Int, // in mV 电压 + val maxInput: Int?, // in mA 最大输入电流 + val capacity: Double?, // in mAh 电池容量 + val chargeCounter: Int?, // in mAh 电量计量 + val chargeCycles: Int? // estimated cycles 充电周期 (估计值) +) + +class BatteryInfo(private val context: Context) { + + fun getBatteryDetails(): BatteryDetails { + val intentFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED) + val batteryStatus = context.registerReceiver(null, intentFilter) + val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager + + // 电池百分比 + val level = batteryStatus?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) ?: -1 + val scale = batteryStatus?.getIntExtra(BatteryManager.EXTRA_SCALE, -1) ?: -1 + val percentage = if (level >= 0 && scale > 0) (level * 100 / scale) else -1 + + // 是否充电 + val status = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1 + val isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL + + // 当前电流 (mA) + val currentNow = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW)?.let { + it / 1000 // 转换为 mA + } + + // 电压 (mV) + val voltage = batteryStatus?.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1) ?: -1 + + // 温度 (摄氏度) + val temperature = (batteryStatus?.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1) ?: -1) / 10.0 + + // 健康状态 + val health = when (batteryStatus?.getIntExtra(BatteryManager.EXTRA_HEALTH, -1) ?: -1) { + BatteryManager.BATTERY_HEALTH_GOOD -> "Good" + BatteryManager.BATTERY_HEALTH_OVERHEAT -> "Overheat" + BatteryManager.BATTERY_HEALTH_DEAD -> "Dead" + BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE -> "Over Voltage" + BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE -> "Failure" + BatteryManager.BATTERY_HEALTH_COLD -> "Cold" + else -> "Unknown" + } + + // 最大输入电流 (mA) + val maxInput = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE)?.let { + it / 1000 // 转换为 mA + } + + // 电池容量 (mAh) + val capacity = batteryManager.getLongProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)?.toDouble() + + // 电量计量 (mAh) + val chargeCounter = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER)?.let { + it / 1000 // 转换为 mAh + } + + // 耗电量 (W) + val powerUsage = if (currentNow != null && voltage > 0) { + (currentNow * voltage) / 1_000_000.0 // 转换为 W + } else { + null + } + + // 充电周期 (估计值) + val chargeCycles = capacity?.let { cap -> + chargeCounter?.let { counter -> + (counter / cap).toInt() + } + } + + return BatteryDetails( + percentage = percentage, + isCharging = isCharging, + currentNow = currentNow, + powerUsage = powerUsage, + temperature = temperature, + health = health, + voltage = voltage, + maxInput = maxInput, + capacity = capacity, + chargeCounter = chargeCounter, + chargeCycles = chargeCycles + ) + } +} \ No newline at end of file diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/main/MainScrollActivity.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/main/MainScrollActivity.kt index e2794b3..bc0ab9b 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/main/MainScrollActivity.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/main/MainScrollActivity.kt @@ -48,7 +48,7 @@ class MainScrollActivity : BaseActivity() { }) }) { tab, position -> tab.text = stringArray[position] -// tab.setCustomView(R.layout.custom_tab) +// tab.setCustomView(R.layout.custom_ta // // tab.customView?.run { // val indicator: ImageView = findViewById(R.id.image_indicator)