Проверьте доступ к уведомлениям с помощью NotificationListenerService

Я знаю, что это старый вопрос, но ответ CMS, похоже, имеет один маленький недостаток: он работает только в том случае, если в формате валюты используется «.». как десятичный разделитель. Например, если вам нужно работать с русскими рублями, строка будет выглядеть так: «1 000,00 руб.»

Мое решение гораздо менее изящно, чем CMS, но оно должно сделать трюк.

var currency = "1 000,00 rub."; //it works for US-style currency strings as well
var cur_re = /\D*(\d.*?\d)(?:\D+(\d{2}))?\D*$/;
var parts = cur_re.exec(currency);
var number = parseFloat(parts[1].replace(/\D/,'')+'.'+(parts[2]?parts[2]:'00'));

Предположения:

  • значение валюты использует десятичную нотацию
  • , в строке нет цифр, которые не являются частью значения валюты
  • Значение
  • валюты содержит 0 или 2 цифры в своей дробной части *

Регулярное выражение может обрабатывать что-то вроде «1,999 долларов и 99 центов», хотя это не " t), и на него не следует полагаться.

Надеюсь, это поможет кому-то.

23
задан Nick 28 December 2014 в 20:30
поделиться

1 ответ

Редактировать 15 июня 2016 г.

Я не уверен, к какой версии добавлена ​​библиотека поддержки , но похоже, что эта функциональность теперь встроена. Просто используйте:

NotificationManagerCompat.getEnabledListenerPackages(context); ( ссылка на документы )

Возвращает Set<String>, через который вы можете выполнить итерацию, чтобы найти имя вашего пакета. Обратите внимание, что я лично не проверял это. Но похоже, что это предпочтительнее использовать вместо моего старого решения ниже.


Старое решение

Этот код работает для моего приложения:

ContentResolver contentResolver = context.getContentResolver();
String enabledNotificationListeners = Settings.Secure.getString(contentResolver, "enabled_notification_listeners");
String packageName = context.getPackageName();

// check to see if the enabledNotificationListeners String contains our package name
if (enabledNotificationListeners == null || !enabledNotificationListeners.contains(packageName))
{
    // in this situation we know that the user has not granted the app the Notification access permission
    throw new Exception();
}
else
{
    doSomethingThatRequiresNotificationAccessPermission();
}

Типичные значения, которые я видел для enabledNotificationsListeners String, выглядят так:

  • Пользователь не предоставил ни одно из своих приложений Разрешение на доступ к уведомлению
    • null или ""
  • Пользователь дал одно уведомление приложения разрешение доступа
    • "com.woodblockwithoutco.remotecontrollerexample/com.woodblockwithoutco.remotecontrollerexample.RemoteControlService"
  • Пользователь дал два приложения Разрешение на доступ к уведомлению
    • "com.scootrnova.android/com.scootrnova.android.ListenerService:com.woodblockwithoutco.remotecontrollerexample/com.woodblockwithoutco.remotecontrollerexample.RemoteControlService"

Эта реализация очень проста и прекрасно работает:)

PS Я получил идею использовать жестко закодированную строку "enabled_notification_listeners" из этого ответа .

52
ответ дан Charles Madere 28 December 2014 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: