From b48f9c4856a921d6aa71325014622ac28ad848d9 Mon Sep 17 00:00:00 2001 From: xsean Date: Tue, 16 Dec 2025 14:40:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Eapp=20=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../andinfo/src/main/AndroidManifest.xml | 1 + .../main/java/com/xyzshell/andinfo/AndInfo.kt | 5 +- .../java/com/xyzshell/andinfo/libs/AppInfo.kt | 121 ++++++++++++++++++ .../myphoneinfo/main/MainScrollActivity.kt | 3 + 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/AppInfo.kt diff --git a/myphoneinfo/andinfo/src/main/AndroidManifest.xml b/myphoneinfo/andinfo/src/main/AndroidManifest.xml index c067acc..66bb195 100644 --- a/myphoneinfo/andinfo/src/main/AndroidManifest.xml +++ b/myphoneinfo/andinfo/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/AndInfo.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/AndInfo.kt index 4629b39..d6be7d1 100644 --- a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/AndInfo.kt +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/AndInfo.kt @@ -1,6 +1,7 @@ package com.xyzshell.andinfo import android.content.Context +import com.xyzshell.andinfo.libs.AppInfo import com.xyzshell.andinfo.libs.CpuInfo import com.xyzshell.andinfo.libs.DeviceInfo import com.xyzshell.andinfo.libs.DisplayInfo @@ -40,6 +41,7 @@ class AndInfo private constructor(private val applicationContext: Context) { private val _camera: CameraInfo private val _bluetooth: BluetoothInfo private val _storage: StorageInfo + private val _app: AppInfo init { _cpu = CpuInfo() @@ -52,6 +54,7 @@ class AndInfo private constructor(private val applicationContext: Context) { _camera = CameraInfo(applicationContext) _bluetooth = BluetoothInfo(applicationContext) _storage = StorageInfo(applicationContext) + _app = AppInfo(applicationContext) } val cpu get() = _cpu @@ -65,6 +68,6 @@ class AndInfo private constructor(private val applicationContext: Context) { val bluetooth get() = _bluetooth val storage get() = _storage val context get() = applicationContext - + val app get() = _app } diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/AppInfo.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/AppInfo.kt new file mode 100644 index 0000000..fb8e651 --- /dev/null +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/AppInfo.kt @@ -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, + val icon: Any // Placeholder for the app's icon +) + +class AppInfo(private val context: Context) { + + fun getInstalledApps(): List { + val packageManager = context.packageManager + val apps = packageManager.getInstalledApplications(PackageManager.GET_META_DATA) + val appDetailsList = mutableListOf() + + 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 + } +} \ 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 74721c1..e2794b3 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/main/MainScrollActivity.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/main/MainScrollActivity.kt @@ -1,8 +1,10 @@ package com.xyzshell.myphoneinfo.main +import android.util.Log import android.view.LayoutInflater import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayoutMediator +import com.xyzshell.andinfo.AndInfo import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.base.BaseActivity @@ -53,6 +55,7 @@ class MainScrollActivity : BaseActivity() { // indicator.isVisible = position == 0 // } }.attach() + } binding.imageTool.setOnClickListener {