Я хочу скрыть все уведомления других приложений, когда мое приложение для Android находится на переднем плане. Это возможно? Как? - PullRequest
0 голосов
/ 28 июня 2018

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

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

Возможно ли это? Как?

Ответы [ 5 ]

0 голосов
/ 10 июля 2018

Это кажется интересным вопросом.

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

Но, скажем, нам нужно обратиться к более низким 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

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

0 голосов
/ 09 июля 2018

Пожалуйста, попробуйте это, чтобы активировать 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 и далее: для доступа к режиму закрепления: Настройки-> Безопасность-> Закрепление экрана-> Включить теперь, когда вы нажимаете кнопку недавних приложений, вы можете увидеть булавку в прихоти, щелкнув по ней, приложение, которое будет первым в стеке, будет закреплено, более подробно https://www.cnet.com/how-to/ho-to-pin-apps-in-android-5-lollipop/

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

0 голосов
/ 06 июля 2018

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

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

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

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

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

0 голосов
/ 08 июля 2018

Вы можете закрыть все уведомления из другого приложения, используя 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

0 голосов
/ 04 июля 2018

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

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" />

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

Второй вариант - использовать Прикрепление экрана , представленное в Android L.

...