新增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" 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>
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
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 {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user