标签: android-windowmanager

如何从 InputMethodService 获取窗口?

是否可以获取特定 View(或)的 Window 对象PopupWindow

我的应用程序是一个键盘,因此它是一个服务(一个InputMethodService),而不是一个活动。因此我不能使用Activity.getWindow(). 然而,它有视图,所以它大概也有一个窗口,不是吗?我怎样才能得到它?

提前致谢...

android android-view android-windowmanager

5
推荐指数
1
解决办法
2828
查看次数

接收隐藏状态栏/在服务上输入全屏活动事件

我有一项服务可以向窗口管理器添加一些视图(类似于 Facebook 的聊天头)。即使我使用相机应用程序,此视图始终位于所有内容之上。是否可以知道某些活动(例如相机或视频播放器)何时使用全屏,以便我可以隐藏我的视图?

编辑:

有一个名为 View.OnSystemUiVisibilityChangeListener 的东西,但它需要 API 11。我的目标是 9,但看起来这正是我需要的。API 9 有替代方案吗?

android overlay android-view android-windowmanager android-fullscreen

5
推荐指数
1
解决办法
3634
查看次数

如何从 Fragment 清除 Android 中的 WindowManager 标志

我有一FLAG_SECURE组活动(它包含敏感数据),但特别是Fragment我需要清除它(因为 od Android Beam)。

Window window = getActivity().getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
Run Code Online (Sandbox Code Playgroud)

这段代码清除了标志(我在 Fragment 的onResume回调中有它),但问题是,直到下一次配置更改(屏幕旋转,...)它才会生效同样的问题是再次设置标志离开 Fragment 时。

有谁知道,我该怎么做才能解决这个问题?(我想过Activity.recreate(),这可以工作,但我不喜欢这个解决方案)Activity如果可能的话,我不想为这个特定的屏幕创建一个单独的屏幕。

android android-windowmanager android-activity

5
推荐指数
1
解决办法
5145
查看次数

在 android 本机屏幕上浮动的 videoview 上播放视频,并且两者都具有触摸侦听器功能

看了很多类似的问题但没有运气......

我正在尝试找到使用媒体控制器播放视频的正确方法(半屏窗口,需要时也可以全屏)。视频应该漂浮在本机控件之上,视频和本机控件都可以接收触摸事件(都是可点击的。就像 Facebook Messenger 图标)。

现在我正在做的事情:我启动一个透明的活动,并在 a 中播放视频,VideoView并将其布局参数和活动的布局参数设置为占据屏幕的一半。另一半是本机屏幕。我将窗口设置为:

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY)

这样做的作用是,我可以看到正在播放的视频,VideoView 但无法触摸和使用其媒体控制器(播放、暂停等),但我可以看到可以触摸的本机屏幕!

我尝试了不同的标志来启用媒体控制器,但随后VideoView完全消耗触摸事件。这意味着现在我无法触摸它后面的本机屏幕的一半

本机屏幕顶部的 VideoView - 两者都可以处理触摸事件, 我认为可能使用对话框或弹出窗口,但找不到说对话框可以接收触摸事件而本机屏幕也可以接收触摸事件的内容。

视频应该始终位于最上面。提前致谢 !:)

android android-dialog android-windowmanager android-videoview android-popupwindow

5
推荐指数
0
解决办法
750
查看次数

如何在没有任何动画的情况下通过 windowManager.UpdateViewLayout 移动视图?

当我做 :

    LayoutParams lp = getLayoutParams(view);
    lp.x = absoluteX;
    lp.y = absoluteY;
    this.mWindowManager.updateViewLayout(view, lp);
Run Code Online (Sandbox Code Playgroud)

然后我有一个从视图所在位置到新位置 absoluteX/absoluteY 的线性动画。如何在没有任何动画的情况下移动视图?

我尝试设置lp.windowAnimations = 0但它没有任何改变:( 知道我该怎么做吗?

如果无法避免动画,他们有什么方法可以知道视图的实际位置吗?也许我可以让它不可见,但实际位置不是绝对X/绝对Y

笔记:

查看android的源代码,我在文件WindowManager.java中看到了这个条目:

     /**
     * Never animate position changes of the window.
     *
     * {@hide} */
    public static final int PRIVATE_FLAG_NO_MOVE_ANIMATION = 0x00000040;

    /**
     * Control flags that are private to the platform.
     * @hide
     */
    public int privateFlags;
Run Code Online (Sandbox Code Playgroud)

它看起来是我需要的,但我不知道如何访问和设置这样的标志 :( 知道吗?

android android-animation android-windowmanager

5
推荐指数
1
解决办法
2064
查看次数

如何使用 UiAutomator 访问覆盖窗口?

我有一个应用程序,它使用两个进程来显示 UI 组件 - 一个用于主应用程序,它使用常规活动,另一个应用程序的 UI 由覆盖层(位于 Service 中)组成,这些覆盖层使用 ViewManager API 添加到 WindowManager。我想使用 UiAutomator 测试叠加层和应用程序之间的交互。

如本问题所述,覆盖视图/窗口很难直接访问。如果我将覆盖层移至主进程,我可以通过使用反射调用 WindowManagerGlobal 上的方法来访问视图,就像 Appium 在此处所做的那样,但如果它们在覆盖层进程中运行,则对 WindowManagerGlobal 的调用不会返回视图。在任何情况下,测试都无法与视图交互,因为只有创建视图的线程才能访问它们,除非通过 UiAutomator 使用的辅助功能框架来访问它们。

有什么方法可以通过辅助功能框架公开覆盖视图,以便 UiAutomator 可以找到它们,即使它们在不同的进程中运行?

我查看了multiprocess Espresso,这听起来非常有前途,因为它有可能弥合两个进程之间的差距,但 Espresso 找不到覆盖视图。是否可以改变添加叠加层的方式,也许可以通过为该过程提供某种根窗口,让 UiAutomator 甚至可能是 Espresso 找到叠加视图?

如果我使用UiDevice转储视图层次结构,我确实会看到系统装饰视图与应用程序的视图位于同一级别。我查看了将视图添加到 WindowManager 的 SystemUI 代码,它与应用程序添加其叠加层的方式非常相似。与我所看到的唯一区别是图层类型。了解系统 UI 组件如何注入到该层次结构(没有更好的词),以及是否可以对应用程序创建的覆盖层执行相同的操作,这将是很有趣的。

android accessibility android-windowmanager android-uiautomator

5
推荐指数
1
解决办法
1189
查看次数

使用辅助服务修改另一个应用程序的视图层次结构

众所周知,我们可以使用以下命令观察查询任何应用程序的视图层次结构AccessibilityService

Create your own accessibility service

还可以代表用户执行操作

Developing an Accessibility Service for Android

我的问题是,我们可以使用修改前台应用程序的视图层次结构吗AccessibilityService

在此输入图像描述

我已经提到了以下问题:

他们正在做的是使用WindowManagerSYSTEM_ALERT_WINDOW权限在前台的应用程序顶部覆盖视图。这种方法的问题是,如果用户按BACKHOME,应用程序将被关闭,但视图在屏幕上仍然可见,即使应用程序消失后也是如此。该视图位于视图层次结构的顶部,而不是它的一部分。

  • 有没有办法添加/修改AccessibilityNodeInfo对象?
  • View这些与 a或相同吗ViewGroup
  • 我们是否允许使用 来添加视图或修改现有视图AccessibilityService

我的要求是在应用程序本身显示一个小视图。它必须是应用程序视图层次结构的一部分,以便它与应用程序一起保留或消失。为此,我需要修改应用程序的视图层次结构,即AccessibilityNodeInfo从服务检索的对象。

我想要的是类似于 的东西addView(),但将 添加View到应用程序本身的视图层次结构中,而不是在其之上。

我们应该怎么做?这可能吗?

更新

支持自定义辅助视图的应用程序

android accessibility android-view android-windowmanager android-viewgroup

5
推荐指数
1
解决办法
1390
查看次数

Android Q 屏幕锁定时如何从广播接收器启动 Activity

我正在尝试使用广播接收器在Android Q中实现基于警报的应用程序。我正在使用通知来运行前台服务来触发警报广播接收器。该服务工作正常,并且还触发广播接收器。如果我们在设置闹钟后关闭应用程序或锁定屏幕,该服务将在前台运行并发出通知。

当调用警报广播时,我试图在屏幕锁定时打开一个新活动,以提供停止警报和服务的功能。我尝试禁用键盘保护,打开屏幕,然后从广播接收器打开活动,但我无法成功。

我尝试使用WindowManager 标志,但它们已被弃用,并且在代码中没有任何区别。

WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
Run Code Online (Sandbox Code Playgroud)

由于我尝试从 BroadcastReceiver 启动活动,因此我不会有任何活动使用KeyguardManager.requestDismissKeyguard(Activity Activity, KeyguardDismissCallback callback)

有没有办法在屏幕锁定时启动活动来关闭闹钟。我的实现如下:

我还在清单文件中添加了权限。

AndroidManifest.xml

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
Run Code Online (Sandbox Code Playgroud)

AlarmBroadcastReceiver.class

public class AlarmBroadcastReceiver extends BroadcastReceiver {
    public static MediaPlayer mp;
    public static Vibrator vibrator;

    private boolean isVibrationEnabled = false;

    @Override
    public void onReceive(Context context, Intent intent) {

        long[] mVibratePattern = new long[]{0, 400, 400, 400, 400, 400, 400, 400};
        final int[] mAmplitudes = …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-alarms keyguard android-windowmanager

5
推荐指数
1
解决办法
3315
查看次数

以编程方式更改主显示分辨率

我正在尝试更改 Android 8.1 上主显示器的显示分辨率。我从内核收到一个事件(基于 EDID),告诉我需要更改模式。

然后我基本上做:

sp<IBinder> display(SurfaceComposerClient::getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
status_t res = SurfaceComposerClient::setActiveConfig(display, new_mode);
Run Code Online (Sandbox Code Playgroud)

这会正确更新 SurfaceFlinger、显示 hal 和内核,但 windowmanager/display 不会更改分辨率,直到我运行:

wm size 1920x1080
wm density 240
Run Code Online (Sandbox Code Playgroud)

但是 wm 调用这些函数,这看起来有点太苛刻了,并且还将尺寸/密度存储在持久设置中:

public void setForcedDisplaySize(int displayId, int width, int height);
public void setForcedDisplayDensityForUser(int displayId, int density, int userId);
Run Code Online (Sandbox Code Playgroud)

我一直在查看 windowmanager/display 中的代码,但没有找到我应该用于此目的的 API。

有没有办法通知 windowmanager/display 有关 surfaceflinger 的更改,或者我错过了可以使用的 API?

我是否以错误的方式处理这个问题?有没有一种正确的方法可以改变主显示器的分辨率/模式,但我还没有找到?

android android-windowmanager surfaceflinger android-displaymanager

5
推荐指数
0
解决办法
868
查看次数

使用WindowManager添加View,但可以按返回键

我使用WindowManager添加了一个View.

它正确显示了我想做的事情,

但我有一个问题.这就是问题.

  • 后退按键不影响android组件(如活动)

我想要的是我添加的视图可以聚焦,(可以单击视图的内部按钮)仅在单击视图时,视图外部可以处理他们的工作.(例如,如果有按钮,可以单击,按后退键时,顶部活动消失)

但是如果我添加一个标志 - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,那么我就无法在添加的视图按钮上接收onClick方法.但后退按钮工作正常.

否则,如果我删除标志 - 我可以收到onClick回调,但现在返回按钮不起作用.

我有一个困境.:(

谢谢.

android-windowmanager

4
推荐指数
1
解决办法
4997
查看次数