Я имею, благодаря помощи определенного блога, какой-то код для получения списка установленных пользователем (т. Е. Несистемными) приложениями на устройстве пользователя: < /p>
Код: Выделить всё
class NotificationPermissionHelper(private val context: Context) {
fun getAllApps(): List {
val packageManager = context.packageManager
val mainIntent = Intent(Intent.ACTION_MAIN, null)
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER)
val resolveInfoList: List = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
packageManager.queryIntentActivities(
mainIntent,
PackageManager.ResolveInfoFlags.of(0L)
)
} else {
packageManager.queryIntentActivities(mainIntent, 0)
}
return resolveInfoList.mapNotNull { resolveInfo ->
try {
packageManager.getApplicationInfo(resolveInfo.activityInfo.packageName, 0)
} catch (e: PackageManager.NameNotFoundException) {
// Handle cases where the application info can't be found.
// This could happen if the app was uninstalled.
null
}
}
}
}
< /code>
Тем не менее, моя попытка отфильтровать это перечисление в соответствии с разрешением уведомления, с треском не склонен ... < /p>
Как вы отфильтровали по разрешению уведомления, для каждого приложения < /h2>
Как это, конечно: < /p>
< /h2>
fun getAppsWithNotificationPermission(): List {
val allApps = getAllApps()
return allApps.filter { hasNotificationPermission(it.packageName) }
}
private fun hasNotificationPermission(packageName: String): Boolean {
// Check if the app is opted into notifications
val appOpsManager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
val mode = getMode(appOpsManager, packageName)
return mode == AppOpsManager.MODE_ALLOWED
}
private fun getMode(appOpsManager: AppOpsManager, packageName: String): Int {
return onGetOp()(appOpsManager,
"android:post_notification",
android.os.Process.myUid(),
packageName,
)
}
private fun onGetOp(): (AppOpsManager, String, Int, String) -> Int {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
return AppOpsManager::unsafeCheckOpNoThrow
}
return AppOpsManager::checkOpNoThrow
}
- На самом деле нетол. Событие на автобусе событий с нашим списком полученных приложений
Когда я размещаю отладочную точку останова в операторе возврата HasnotificationPermission ,
Код: Выделить всё
mode == 1
< /code>
Но < /p>
AppOpsManager.MODE_ALLOWED == 0
Код: Выделить всё
protected fun hasDataAccessPermission(): Boolean {
return ContextCompat.checkSelfPermission(
this,
this.permission,
) == PackageManager.PERMISSION_GRANTED
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... -in-kotlin