Почему уведомления моего приложения Android перестают отображаться (Meizu Flyme OS)?

Я сделал простой проект Android Studio для тестирования API уведомлений. В приложении есть единственная кнопка, при нажатии которой отображается уведомление. Я устанавливаю приложение на телефон Android Meizu под управлением ОС Flyme. См. код ниже:

      public class MainActivity extends AppCompatActivity {

private AppBarConfiguration appBarConfiguration;
private ActivityMainBinding binding;

NotificationManager notification;
Button btn;
String ChannelID = "ChannelID";
String ChannelName = "ChannelName";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());

    setSupportActionBar(binding.toolbar);

    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
    appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
    NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);

    binding.fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    btn = findViewById(R.id.button_first);
    notification = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

    btn.setOnClickListener(view -> {
        NotificationChannel notificationChannel = new NotificationChannel(ChannelID,
                ChannelName,
                NotificationManager.IMPORTANCE_HIGH);
        notification.createNotificationChannel(notificationChannel);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, ChannelID);

        builder.setSmallIcon(R.mipmap.ic_launcher_round)
                .setContentTitle("Test Title").setContentText("Test content text");
        Notification n = builder.build();
        notification.notify((int) (new Date()).getTime(), builder.build());
    });
}
}

Поначалу это работает нормально, и уведомления появляются так, как ожидалось. Однако через некоторое время после установки программы уведомления перестают появляться при нажатии кнопки. Я пробовал удалить и переустановить программу, перезагрузить телефон и перезапустить Android Studio, но ни одно из этих действий не привело к повторному отображению уведомлений.

Единственное, что я нашел, что работает, это изменить идентификатор приложения проекта (щелкните правой кнопкой мыши корневую папку в Android Studio -> тег конфигурации по умолчанию -> идентификатор приложения). Когда я меняю это и переустанавливаю, уведомления снова начинают отображаться.

В журналах моего приложения нет ничего необычного, но когда я просмотрел системные журналы, когда я нажимаю кнопку, я обнаружил несколько журналов чего-то под названием NotificationService и NotificationFirewall, которые кажутся подозрительными.

Когда уведомления отображаются, журналы выглядят следующим образом:

      NotificationFirewall    pid-1562    D  getFilterResult Main begin
NotificationFirewall    pid-1562    D  interceptNotification A begin
NotificationFirewall    pid-1562    D  handleMessage: interceptNotification begin
NotificationFirewall    pid-1562    D  handleMessage: interceptNotification end,mResult=category=news;categoryPriority=0,notificationPriority=0;userFilter=0;tag=news;isValid=true;intercept=false,score=100.0,score_scale=10.0,shouldAffectRanking =true,shouldAffectIntercept=true,shouldAuthorityManagement=false,filterByUserBefore=false
NotificationFirewall    pid-1562    D  interceptNotification A end
NotificationFirewall    pid-1562    D  getFilterResult: mResultNull=false,mNotificationKey=0|com.example.notiftest5|-1785528131|null|10600,sbn.getKey()=0|com.example.notiftest5|-1785528131|null|10600
NotificationFirewall    pid-1562    D  getNotificationFilter: pkg=com.example.notiftest5,result=category=news;categoryPriority=0,notificationPriority=0;userFilter=0;tag=news;isValid=true;intercept=false,score=100.0,score_scale=10.0,shouldAffectRanking =true,shouldAffectIntercept=true,shouldAuthorityManagement=false,filterByUserBefore=false
NotificationFirewall    pid-1562    D  getNotificationFilter: pkg=com.example.notiftest5,isMediaNoti=false,isAutoFilterMode=true
NotificationService     pid-1562    D  enqueueNotificationInternal: pkg=com.example.notiftest5,id=-1785528131,ufk=com.example.notiftest5$ChannelID,n.filter=category=news;categoryPriority=0,notificationPriority=0;userFilter=0;tag=news;score=10.000000,score_scale=10.000000;intercept=false;shouldAffectRanking=true;shouldAffectIntercept=true;shouldAuthorityManagement=true;filterByUserBefore=false
NotificationService     pid-1562    D  showWakeUpScreen: aboveThreshold=true,DND=0,isUpdate=false,alertOnce=0,noClear=0,onGoing=0,category=nulluserFilter=0

Если это не так, журналы меняются на следующее:

      NotificationFirewall    pid-1562    D  getFilterResult Main begin
NotificationFirewall    pid-1562    D  interceptNotification A begin
NotificationFirewall    pid-1562    D  handleMessage: interceptNotification begin
NotificationFirewall    pid-1562    D  handleMessage: interceptNotification end,mResult=category=news;categoryPriority=0,notificationPriority=0;userFilter=0;tag=news;isValid=true;intercept=false,score=100.0,score_scale=10.0,shouldAffectRanking =true,shouldAffectIntercept=true,shouldAuthorityManagement=false,filterByUserBefore=false
NotificationFirewall    pid-1562    D  interceptNotification A end
NotificationFirewall    pid-1562    D  getFilterResult: mResultNull=false,mNotificationKey=0|com.example.notiftest|-1785734812|null|10599,sbn.getKey()=0|com.example.notiftest|-1785734812|null|10599
NotificationFirewall    pid-1562    D  getNotificationFilter: pkg=com.example.notiftest,result=category=news;categoryPriority=0,notificationPriority=0;userFilter=0;tag=news;isValid=true;intercept=false,score=100.0,score_scale=10.0,shouldAffectRanking =true,shouldAffectIntercept=true,shouldAuthorityManagement=false,filterByUserBefore=false
NotificationFirewall    pid-1562    D  getNotificationFilter: pkg=com.example.notiftest,isMediaNoti=false,isAutoFilterMode=true
NotificationService     pid-1562    D  enqueueNotificationInternal: pkg=com.example.notiftest,id=-1785734812,ufk=com.example.notiftest$ChannelID,n.filter=category=news;categoryPriority=0,notificationPriority=0;userFilter=0;tag=news;score=-100.000000,score_scale=10.000000;intercept=true;shouldAffectRanking=true;shouldAffectIntercept=true;shouldAuthorityManagement=true;filterByUserBefore=true
NotificationService     pid-1562    D  showWakeUpScreen: aboveThreshold=false,DND=0,isUpdate=false,alertOnce=0,noClear=0,onGoing=0,category=nulluserFilter=0

В частности, когда уведомления перестают отображаться, значения «score=10,000000», «intercept=false», «filterByUserBefore=false» меняются на «score=-100,000000», «intercept=true», «filterByUserBefore=true».

Похоже, что в ОС установлено что-то, что отфильтровывает уведомления для моего идентификатора приложения. Однако я не могу найти никакой информации о NotificationFirewall или NotificationService, поэтому я до сих пор не знаю, почему уведомления моих приложений фильтруются или как изменить настройки фильтра.

1 ответ

Оказалось, что мои уведомления перехватывались функцией «Неважные уведомления» ОС Flyme.

В правом верхнем углу панели уведомлений находится небольшой значок, похожий на картинку. Коснитесь его, чтобы открыть страницу «Не важные уведомления». Перехваченные уведомления будут отображаться там. Нажмите и удерживайте уведомление, чтобы увидеть несколько вариантов. Нажмите «Оповещение», чтобы продолжить получать уведомления с этого канала и предотвратить их перехват.

Другие вопросы по тегам