新增app 信息列表

This commit is contained in:
xsean 2025-12-16 14:40:10 +08:00
parent 7107257bcf
commit b48f9c4856
4 changed files with 129 additions and 1 deletions

View File

@ -5,6 +5,7 @@
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<application android:name=".AndInfoApp"> <application android:name=".AndInfoApp">
</application> </application>
</manifest> </manifest>

View File

@ -1,6 +1,7 @@
package com.xyzshell.andinfo package com.xyzshell.andinfo
import android.content.Context import android.content.Context
import com.xyzshell.andinfo.libs.AppInfo
import com.xyzshell.andinfo.libs.CpuInfo import com.xyzshell.andinfo.libs.CpuInfo
import com.xyzshell.andinfo.libs.DeviceInfo import com.xyzshell.andinfo.libs.DeviceInfo
import com.xyzshell.andinfo.libs.DisplayInfo import com.xyzshell.andinfo.libs.DisplayInfo
@ -40,6 +41,7 @@ class AndInfo private constructor(private val applicationContext: Context) {
private val _camera: CameraInfo private val _camera: CameraInfo
private val _bluetooth: BluetoothInfo private val _bluetooth: BluetoothInfo
private val _storage: StorageInfo private val _storage: StorageInfo
private val _app: AppInfo
init { init {
_cpu = CpuInfo() _cpu = CpuInfo()
@ -52,6 +54,7 @@ class AndInfo private constructor(private val applicationContext: Context) {
_camera = CameraInfo(applicationContext) _camera = CameraInfo(applicationContext)
_bluetooth = BluetoothInfo(applicationContext) _bluetooth = BluetoothInfo(applicationContext)
_storage = StorageInfo(applicationContext) _storage = StorageInfo(applicationContext)
_app = AppInfo(applicationContext)
} }
val cpu get() = _cpu val cpu get() = _cpu
@ -65,6 +68,6 @@ class AndInfo private constructor(private val applicationContext: Context) {
val bluetooth get() = _bluetooth val bluetooth get() = _bluetooth
val storage get() = _storage val storage get() = _storage
val context get() = applicationContext val context get() = applicationContext
val app get() = _app
} }

View File

@ -0,0 +1,121 @@
package com.xyzshell.andinfo.libs
import android.content.Context
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.os.Build
import android.os.storage.StorageManager
import java.io.File
data class PermissionInfo(
val name: String,
val description: String?,
val status: String
)
data class AppDetails(
val appName: String,
val packageName: String,
val versionName: String?,
val versionCode: Long,
val targetSdkVersion: Int,
val minSdkVersion: Int?,
val installer: String?,
val lastUpdateTime: Long,
val size: Long,
val uid: Int,
val permissions: List<PermissionInfo>,
val icon: Any // Placeholder for the app's icon
)
class AppInfo(private val context: Context) {
fun getInstalledApps(): List<AppDetails> {
val packageManager = context.packageManager
val apps = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
val appDetailsList = mutableListOf<AppDetails>()
for (app in apps) {
// 过滤掉系统应用
if ((app.flags and ApplicationInfo.FLAG_SYSTEM) != 0) {
continue
}
val packageInfo = packageManager.getPackageInfo(app.packageName, PackageManager.GET_PERMISSIONS)
val appName = app.loadLabel(packageManager).toString()
val versionName = packageInfo.versionName
val versionCode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
packageInfo.longVersionCode
} else {
@Suppress("DEPRECATION")
packageInfo.versionCode.toLong()
}
val targetSdkVersion = app.targetSdkVersion
val minSdkVersion = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
app.minSdkVersion
} else {
null
}
val installer = packageManager.getInstallerPackageName(app.packageName)
val lastUpdateTime = packageInfo.lastUpdateTime
val size = getAppSize(app.sourceDir)
val uid = app.uid
// val permissions = packageInfo.requestedPermissions?.toList() ?: emptyList()
val icon = app.loadIcon(packageManager)
val permissions = packageInfo.requestedPermissions?.map { permission ->
val permissionInfo = try {
packageManager.getPermissionInfo(permission, 0)
} catch (e: PackageManager.NameNotFoundException) {
null
}
val permissionDescription = if (permissionInfo != null) {
permissionInfo.loadDescription(packageManager)?.toString() ?: "No description available"
} else {
"No description available"
}
val permissionStatus = when {
context.checkPermission(permission, android.os.Process.myPid(), android.os.Process.myUid()) == PackageManager.PERMISSION_GRANTED -> {
"Allowed"
}
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context.checkSelfPermission(permission) == PackageManager.PERMISSION_DENIED -> {
"Denied"
}
else -> {
"Special Access"
}
}
PermissionInfo(
name = permission,
description = permissionDescription,
status = permissionStatus
)
} ?: emptyList()
appDetailsList.add(
AppDetails(
appName = appName,
packageName = app.packageName,
versionName = versionName,
versionCode = versionCode,
targetSdkVersion = targetSdkVersion,
minSdkVersion = minSdkVersion,
installer = installer,
lastUpdateTime = lastUpdateTime,
size = size,
uid = uid,
permissions = permissions,
icon = icon
)
)
}
return appDetailsList
}
private fun getAppSize(sourceDir: String): Long {
val file = File(sourceDir)
return if (file.exists()) file.length() else 0L
}
}

View File

@ -1,8 +1,10 @@
package com.xyzshell.myphoneinfo.main package com.xyzshell.myphoneinfo.main
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
import com.xyzshell.andinfo.AndInfo
import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.R
import com.xyzshell.myphoneinfo.base.BaseActivity import com.xyzshell.myphoneinfo.base.BaseActivity
@ -53,6 +55,7 @@ class MainScrollActivity : BaseActivity<ActivityMainBinding>() {
// indicator.isVisible = position == 0 // indicator.isVisible = position == 0
// } // }
}.attach() }.attach()
} }
binding.imageTool.setOnClickListener { binding.imageTool.setOnClickListener {