Я хочу скрыть все уведомления о других приложениях, когда приложение Android находится на переднем плане. Это возможно? Как?

Я создаю учебное приложение, в котором школьники могут появиться на 5-минутных экзаменах. Большую часть времени они используют свой родительский мобильный телефон.

Теперь я хочу, чтобы, когда студент сдавал экзамен, никакое уведомление не должно поступать из любого другого приложения, такого как WhatsApp, FB или Gmail.

Это возможно? Как?

Ответ 1

Одним из возможных решений было бы установить телефон в режиме "Не беспокоить" ("Не беспокоить"). Я не тестировал это, но согласно документации, которую вы должны сделать:

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
int currentFilter = notificationManager.getCurrentInterruptionFilter();
notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE);
// Run the exam...
// Restore the filter
notificationManager.setInterruptionFilter(currentFilter);

Для этого требуется специальное разрешение доступа к DND, но для этого требуется Android M:

<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />

Это разрешение должно быть принято пользователем через Настройки. См. Этот вопрос для получения дополнительной информации и того, как вы можете запустить активность, которая ведет к этой настройке.

Второй вариант - использовать Screen Pinning, который был введен в Android L.

Ответ 2

Вы можете закрыть все уведомления из другого приложения, используя NotificationListenerService:

public class NotificationListener extends NotificationListenerService {

    @Override
    public void onNotificationPosted(StatusBarNotification statusBarNotification) {
      cancelNotification(statusBarNotification.getKey());
    }
}

Вы должны объявить службу в вашем файле манифеста с помощью разрешения Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE и включить фильтр намерений с действием SERVICE_INTERFACE. Например:

 <service android:name=".NotificationListener"
          android:label="@string/service_name"
          android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
     <intent-filter>
         <action android:name="android.service.notification.NotificationListenerService" />
     </intent-filter>
 </service>

https://developer.android.com/reference/android/service/notification/NotificationListenerService.html

Ответ 3

Это похоже на интересный вопрос.

Лично мне нравится идея DND. Это просто, менее грязно и эффективно.

Но скажите, что нам нужно обратиться к более низким API, вы можете использовать один подход, чтобы быть таким.

У вас может быть свой собственный прослушиватель уведомлений.

import android.annotation.SuppressLint;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;

@SuppressLint("OverrideAbstract")
public class NotificationListener  extends NotificationListenerService {

    public static String TAG = NotificationListener.class.getSimpleName();

    @Override
    public void onNotificationPosted(StatusBarNotification sbm) {

        /**
         * This condition will define how you will identify your test is running
         * You can have an in memory variable regarding it, or persistant variable,
         * Or you can use Settings to store current state.
         * You can have your own approach
         */
        boolean condition = true; // say your test is running

        if(condition)
            cancelAllNotifications(); //Cancel all the notifications . No Disturbance 

        //else
            // nothing.
    }
}

Добавьте это в манифест

 <service android:name=".NotificationListener"
        android:label="@string/app_name"
        android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
        <intent-filter>
            <action android:name="android.service.notification.NotificationListenerService" />
        </intent-filter>
    </service>

Теперь для этого вам потребуется разрешение доступа к уведомлению. В своем приложении точки входа (или перед тестированием в соответствии с вашей логикой) вы можете проверить это

if (!NotificationManagerCompat.getEnabledListenerPackages(getApplicationContext())
            .contains(getApplicationContext().getPackageName())) {
        //We dont have access
        Intent intent= new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
         //For API level 22+ you can directly use Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivityForResult(intent,NOTIFICATION_REQUEST_CODE);
    } else {
        //Your own logic
        Log.d(TAG, "You have Notification Access");

    }

Это намерение откроет страницу, как показано ниже, которую пользователь должен будет включить для предоставления вам доступа.

enter image description here

Надеюсь это поможет.

Ответ 4

Если это экзамен, вы, скорее всего, будете использовать свое собственное устройство и не будете работать на студенческих устройствах.

В этом случае ваше приложение может быть "владельцем устройства". См. Документацию владельца устройства

Это позволит вам использовать режим Lock Task. См. Документацию по документу "Заблокировать задание". Эта ссылка также содержит задачу блокировки и сопоставление пиннинга. Вы можете использовать привязку экрана, если ваше приложение не может быть "владельцем устройства",

Я настоятельно рекомендую использовать режим блокировки для любого экзамена приложения для блокировки доступа к остальной части устройства (а не только к уведомлениям)

В вашем макете добавьте "android: fitsSystemWindows =" true ", чтобы полностью заблокировать доступ к линии верха.

Ответ 5

Пожалуйста, попробуйте активировать DND:

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE);

Это потребует:

<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />

или для ручного запроса разрешения DND:

NotificationManager mNotificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);

 if (!mNotificationManager.isNotificationPolicyAccessGranted()) {
     Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
     startActivity(intent);
 }

или вы также можете включить режим вывода, который всегда поддерживает приложение на переднем плане, и все уведомления (даже панель уведомлений отключена) доступны из Lollipop и далее: для доступа к режиму пиннинга: Settings-> Безопасность-> Экран Pinning-> повернуть его теперь, когда вы нажимаете кнопку последних приложений, вы можете увидеть прихоть, нажмите на нее, приложение, которое находится в первом стеке, будет закреплено для более подробной информации: https://www.cnet.com/how-to/хо-к-пин-приложений-в-андроид-5-леденец/

Надеюсь, это поможет Счастливое кодирование... :)