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 {