Получение списка других приложений, которые могут отправлять уведомления в КотлинAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Получение списка других приложений, которые могут отправлять уведомления в Котлин

Сообщение Anonymous »

Back Story < /h2>
Я имею, благодаря помощи определенного блога, какой-то код для получения списка установленных пользователем (т. Е. Несистемными) приложениями на устройстве пользователя: < /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
}

У нас есть packagelistdatasource , которая использует шину событий для запуска PackageQueryFetcherActivity , которая:
  • На самом деле нетол. Событие на автобусе событий с нашим списком полученных приложений
Что происходит при запусках кода? Пустой список, как и для каждого приложения ....
Когда я размещаю отладочную точку останова в операторе возврата HasnotificationPermission ,

Код: Выделить всё

mode == 1
< /code>
Но < /p>
AppOpsManager.MODE_ALLOWED == 0
Говоря о разрешениях, мы не получаем экран аутентификации для запроса всех пакетов, как это определено на нашем BaseFetcherActivity возвращает true для разрешения = Android.manifest.permission.query_all_packages :

Код: Выделить всё

protected fun hasDataAccessPermission(): Boolean {
return ContextCompat.checkSelfPermission(
this,
this.permission,
) == PackageManager.PERMISSION_GRANTED
}
Итак, он просто выполняет выборку всех приложений (как обсуждался eariler), и проверка на наличие пакета приложений имеет разрешение уведомления, похоже, всегда возвращает AppopsManager.mode_Ignored

Подробнее здесь: https://stackoverflow.com/questions/796 ... -in-kotlin
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»