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);
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.
}
}
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");
}
public class NotificationListener extends NotificationListenerService {
@Override
public void onNotificationPosted(StatusBarNotification statusBarNotification) {
cancelNotification(statusBarNotification.getKey());
}
}
6条答案
按热度按时间zlwx9yxi1#
一个可能的解决方案是将手机设置为DND(请勿打扰)模式。我还没有测试过这个,但根据文档,你应该能够做到:
字符串
这需要特殊的免打扰访问权限,并且需要Android M:
型
该权限需要用户通过设置接受。请参阅this question了解更多背景以及如何启动导致此设置的Activity。
第二种选择是使用Android L中引入的Screen Pinning。
3vpjnl9f2#
这似乎是一个有趣的问题。
就我个人而言,我喜欢免打扰的想法。它简单,不那么混乱,而且有效。
但是,说我们需要接触到较低的API,你可以使用一种方法是这样的.
你可以有自己的通知。
字符串
将此添加到清单
型
现在,你需要通知访问权限。在你的应用程序中,入口点(或根据你的逻辑在测试之前),你可以检查这个
型
此Intent将打开一个如下所示的页面,用户必须启用该页面才能为您提供访问权限。
的数据
希望这对你有帮助。
kcugc4gi3#
您可以使用NotificationListenerService关闭来自其他应用的所有通知:
字符串
您必须在清单文件中使用
Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE
权限声明服务,并在SERVICE_INTERFACE操作中包含Intent过滤器。例如:型
https://developer.android.com/reference/android/service/notification/NotificationListenerService.html
xriantvc4#
请尝试以下操作以激活DND:
字符串
这将需要:
型
或手动要求启用免打扰:
型
或者你也可以打开固定模式,使应用程序始终处于前台,所有通知(甚至通知栏被禁用)都可以从棒棒糖开始:要访问固定模式:设置->安全->屏幕固定->现在打开它当你按下最近的应用程序按钮,你可以看到一个引脚心血来潮,点击它,应用程序是堆栈中的第一个将被固定,更多细节:https://www.cnet.com/how-to/ho-to-pin-apps-in-android-5-lollipop/
希望这对快乐编码有帮助...:)
u3r8eeie5#
使用屏幕固定/锁定任务模式是此类应用程序的正确选项
标签:https://developer.android.com/work/dpc/dedicated-devices/lock-task-mode
还有这个:https://developer.android.com/about/versions/lollipop/android-5.0#ScreenPinning
wfypjpf46#
如果是考试,您可能会使用自己的设备,而不是在学生设备上运行。
在这种情况下,您的应用程序可以是“设备所有者”。
这将允许您使用锁定任务模式。请参阅Lock task mode documentation此链接也有锁定任务与固定比较。如果您的应用程序不能成为“设备所有者”,则可以使用屏幕固定
我强烈建议对任何考试应用程序使用锁定任务模式,以阻止对设备其余部分的访问(而不仅仅是通知)
请注意,在布局中添加“android:fitsSystemWindows=“true”以完全阻止对背线的访问。