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