firebase 当我的Android应用程序处于前台时,我想隐藏其他应用程序的所有通知,这可能吗?如何实现?

drkbr07n  于 2023-11-21  发布在  Android
关注(0)|答案(6)|浏览(173)

我正在创建一个教育应用程序,学校的学生可以出现5分钟的快速考试。大多数时候,他们使用他们父母的移动的手机。
现在我想要的是,当学生进行考试时,任何其他应用程序(如WhatsApp,FB或Gmail)都不应发出通知。
这可能吗?怎么可能?

zlwx9yxi

zlwx9yxi1#

一个可能的解决方案是将手机设置为DND(请勿打扰)模式。我还没有测试过这个,但根据文档,你应该能够做到:

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);

字符串
这需要特殊的免打扰访问权限,并且需要Android M:

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


该权限需要用户通过设置接受。请参阅this question了解更多背景以及如何启动导致此设置的Activity。
第二种选择是使用Android L中引入的Screen Pinning。

3vpjnl9f

3vpjnl9f2#

这似乎是一个有趣的问题。
就我个人而言,我喜欢免打扰的想法。它简单,不那么混乱,而且有效。
但是,说我们需要接触到较低的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");

    }


此Intent将打开一个如下所示的页面,用户必须启用该页面才能为您提供访问权限。


的数据
希望这对你有帮助。

kcugc4gi

kcugc4gi3#

您可以使用NotificationListenerService关闭来自其他应用的所有通知:

public class NotificationListener extends NotificationListenerService {

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

字符串
您必须在清单文件中使用Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE权限声明服务,并在SERVICE_INTERFACE操作中包含Intent过滤器。例如:

<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

xriantvc

xriantvc4#

请尝试以下操作以激活DND:

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

字符串
这将需要:

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


或手动要求启用免打扰:

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);
 }


或者你也可以打开固定模式,使应用程序始终处于前台,所有通知(甚至通知栏被禁用)都可以从棒棒糖开始:要访问固定模式:设置->安全->屏幕固定->现在打开它当你按下最近的应用程序按钮,你可以看到一个引脚心血来潮,点击它,应用程序是堆栈中的第一个将被固定,更多细节:https://www.cnet.com/how-to/ho-to-pin-apps-in-android-5-lollipop/
希望这对快乐编码有帮助...:)

u3r8eeie

u3r8eeie5#

使用屏幕固定/锁定任务模式是此类应用程序的正确选项
标签:https://developer.android.com/work/dpc/dedicated-devices/lock-task-mode
还有这个:https://developer.android.com/about/versions/lollipop/android-5.0#ScreenPinning

wfypjpf4

wfypjpf46#

如果是考试,您可能会使用自己的设备,而不是在学生设备上运行。
在这种情况下,您的应用程序可以是“设备所有者”。
这将允许您使用锁定任务模式。请参阅Lock task mode documentation此链接也有锁定任务与固定比较。如果您的应用程序不能成为“设备所有者”,则可以使用屏幕固定
我强烈建议对任何考试应用程序使用锁定任务模式,以阻止对设备其余部分的访问(而不仅仅是通知)
请注意,在布局中添加“android:fitsSystemWindows=“true”以完全阻止对背线的访问。

相关问题