新增app 信息列表
This commit is contained in:
parent
7107257bcf
commit
b48f9c4856
@ -5,6 +5,7 @@
|
||||
<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_CONNECT" />
|
||||
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
|
||||
<application android:name=".AndInfoApp">
|
||||
</application>
|
||||
</manifest>
|
||||
|
||||
@ -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
|
||||
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
@ -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<ActivityMainBinding>() {
|
||||
// indicator.isVisible = position == 0
|
||||
// }
|
||||
}.attach()
|
||||
|
||||
}
|
||||
|
||||
binding.imageTool.setOnClickListener {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user