当前位置: 首页 > 知识库问答 >
问题:

如何确定是否显示任何系统对话框?

曾阳飙
2023-03-14

如何检查Android中是否显示任何系统对话框(如下面的或USSD)?

编程方式或cmd根方式?任何变体。

共有3个答案

岳华灿
2023-03-14

你的问题让我想到了Android6中权限管理使用的解决方案。如果在尝试设置权限时打开Toast或系统警报对话框,您是否看到过错误消息?如果用户在显示通知时试图授予权限,则显示Android“Screen Overlay Detected”消息

他们这样做的方式是覆盖活动中的调度触摸事件方法。这可以检查是否有任何东西“妨碍”拦截触摸事件。您可以将您的特殊活动用作应用程序中任何希望检测其上任何覆盖的活动的基类。

   @Override
   public boolean dispatchTouchEvent(MotionEvent event) {
       mObscured = (event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0;
    return super.dispatchTouchEvent(event);
}

添加公共方法,以便在任何给定时间检查您的活动是否被遮挡

public boolean isObscured() {
    return mObscured;
}

您应该小心——因为从问题中还不清楚——如果来自系统或特权应用程序的第二个活动位于堆栈的前面,那么您自己的活动将不再接收触摸事件。这是为了捕获片段、烤面包、浮动小部件和其他可能共享视图层次结构的项目。

林曦之
2023-03-14

系统对话框是一种活动。您可以使用ActivityManager通过顶级活动类名来检测它。

final ActivityManager manager = (ActivityManager) context
    .getSystemService(Activity.ACTIVITY_SERVICE);

在API级别低于23(M)的设备中:

final List<ActivityManager.RunningTaskInfo> runningTasks = manager.getRunningTasks(1);
final ComponentName componentName = runningTasks.get(0).topActivity;
final String className = componentName.getClassName();

if (className.equals("YOUR_EXPECTED_ACTIVITY_CLASS_NAME")) {
    // do something
}

在较新的设备中:

final List<ActivityManager.AppTask> appTasks = manager.getAppTasks();
final ComponentName componentName = appTasks.get(0).getTaskInfo().topActivity;
final String className = componentName.getClassName();

if (className.equals("YOUR_EXPECTED_ACTIVITY_CLASS_NAME")) {
    // do something
}

或者在这种情况下,您可以在开始活动之前检查设备是否处于飞行模式:

private boolean isAirplaneModeOn(final Context context) {
    final int airplaneMode = Settings.System.getInt(
        context.getContentResolver(),
        Settings.System.AIRPLANE_MODE_ON,
        0
    );

    return airplaneMode != 0;
}

...

if (!isAirplaneModeOn(this)) {
    // do something
}
常俊爽
2023-03-14

理论上,您可以使用AccessibilityService来实现这一点,但它相当复杂,可能在不同的设备上工作,也可能不工作。用户需要手动启用应用程序的辅助功能。每当打开任何窗口时,您都可以从Android获得回调,然后您可以查询窗口以确定其中是否包含特定文本或是否属于特定软件包等。这是一种“暴力”方法,但在某些情况下可能很有用。

 类似资料:
  • 我在应用程序中使用“Android-Rate”库。当我尝试显示对话框时遇到问题。 当对话框打开时,里面有我放的句子,但我看不到下图中的按钮: 如您所见,文本显示但按钮未显示,就像按钮不可见一样,但如果您单击对话框的白色部分,它将打开App Store页面。 这是我的代码: 我还将此代码放在<code>Strings.xml</code>中: 你能帮我解决这个问题吗?

  • 问题内容: 我希望此链接具有一个JavaScript对话框,询问用户“ 您确定吗? 是/否 ”。 如果用户单击“是”,则链接应该加载,如果“否”,则什么也不会发生。 我知道如何通过运行返回或的函数以表格形式进行操作。但是,我该如何使用链接呢? 问题答案: 内联事件处理程序 以最简单的方式,您可以在内联处理程序中使用该函数。 高级事件处理 但是通常情况下,您希望将HTML和Javascript分开,

  • 本文向大家介绍如何使用JavaScript显示提示对话框?,包括了如何使用JavaScript显示提示对话框?的使用技巧和注意事项,需要的朋友参考一下 当您要弹出文本框以获取用户输入时,提示对话框非常有用。因此,它使您可以与用户进行交互。用户需要填写该字段,然后单击“确定”。 使用称为的方法显示此对话框,该方法带有两个参数:(i)您要在文本框中显示的标签,以及(ii)要在文本框中显示的默认字符串。

  • 我必须取消此系统(附件如下)。我正在获取这个值,但是我不能在服务中,而不是在活动中,以编程方式取消它。 我的问题是: null

  • 本文向大家介绍H5如何禁止显示系统菜单?相关面试题,主要包含被问及H5如何禁止显示系统菜单?时的应答技巧和注意事项,需要的朋友参考一下 touch-callout:none; user-select:none;

  • 问题内容: 我需要确定JavaScript中的数组中是否已存在对象。 例如(dummycode): 现在,“carBrands”数组包含所有实例。我现在正在寻找一种快速解决方案,以检查car1,car2,car3或car4的实例是否已经在carBrands数组中。 例如: car1和car4包含相同的数据,但是不同的实例,应测试它们是否相等。 我是否在创建时向对象添加了哈希值?还是有更快的方法来用