使用 WindowManager.LayoutParams.TYPE_KEYGUARD 时,最小目标必须小于 14

2023-11-24

我试图防止状态栏扩展,并且我使用了一些人们试图覆盖主页按钮的示例。所有解决方案都指向使用WindowManager.LayoutParams.TYPE_KEYGUARD, 我读here,如果使用 TYPE_KEYGUARD,则最小目标必须小于 14。 TYPE_KEYGUARD 已弃用,因此我也需要解决此问题。它已从 SDK 21 中完全删除。

问题:有什么解决方法可以覆盖状态栏并将目标版本保持为 19?

我有一个项目设置为这样的构建:

android {
   compileSdkVersion 17
   buildToolsVersion "21.1.2"

   defaultConfig {
      applicationId "com.mycompany.ediary"
      minSdkVersion 12
      targetSdkVersion 12
   }

   buildTypes {
      release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
      }
   }
}

我已经尝试过建议here无济于事。我希望 targetSdkVersion 为 19,但如果我将其更改为 19,则会收到 IllegalArgumentException。堆栈跟踪:

11-26 13:41:57.963  28667-28667/com.assistek.ediary E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.assistek.ediary, PID: 28667
java.lang.IllegalArgumentException: Window type can not be changed after the window is added.
    at android.os.Parcel.readException(Parcel.java:1550)
    at android.os.Parcel.readException(Parcel.java:1499)
    at android.view.IWindowSession$Stub$Proxy.relayout(IWindowSession.java:903)
    at android.view.ViewRootImpl.relayoutWindow(ViewRootImpl.java:5301)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1507)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
    at android.view.Choreographer.doCallbacks(Choreographer.java:580)
    at android.view.Choreographer.doFrame(Choreographer.java:550)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

My onCreate:

 @Override
 protected void onCreate(Bundle savedInstanceState) {

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    ...
 }

My onAttachedToWindow:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);

    if (!GlobalVars.testing) {
        GlobalVars.preventStatusBarExpansion(this);
    }
  }

以及防止状态栏扩展的代码(改编自这个帖子):

public static void preventStatusBarExpansion(Context context) {
    WindowManager manager = ((WindowManager) context.getApplicationContext()
            .getSystemService(Context.WINDOW_SERVICE));

    WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
    localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
    localLayoutParams.gravity = Gravity.TOP;
    localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|

            // this is to enable the notification to recieve touch events
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |

            // Draws over status bar
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;

    localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
    localLayoutParams.height = (int) (50 * context.getResources()
            .getDisplayMetrics().scaledDensity);
    localLayoutParams.format = PixelFormat.TRANSPARENT;

    customViewGroup view = new customViewGroup(context);

    manager.addView(view, localLayoutParams);
} 

public static class customViewGroup extends ViewGroup {

    public customViewGroup(Context context) {
        super(context);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.v("customViewGroup", "**********Intercepted");
        return true;
    }
}

如下所示更新 onAttachedToWindow 并尝试

@Override
public void onAttachedToWindow() { 
    if (!GlobalVars.testing) {
       GlobalVars.preventStatusBarExpansion(this);
    }
    super.onAttachedToWindow();
}

并添加更新 oncreate

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,   WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    ...
 }

对于Api 14以上使用

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 WindowManager.LayoutParams.TYPE_KEYGUARD 时,最小目标必须小于 14 的相关文章

随机推荐

  • 使用 File.Encrypt 加密文件,然后将其解密到内存流

    我需要实现一个简单的文件加密 然后在需要时将其解密到内存流 最简单的方法似乎是使用 File Encrypt 来做到这一点 但是是否可以将文件解密到内存流 而不是在将文件读取到内存流之前解密文件 从而将其暴露一段时间 如果 File Enc
  • Xcode 4.3 和 iPhone 模拟器 4.2

    有没有办法在 Xcode 中安装 iPhone Simulator 4 24 3为了狮子 我只能找到如何在 Xcode 4 2 中安装它 但不能找到 Xcode 4 3 for Lion 中的安装方法 我找到了一种将iPhone模拟器4 2
  • Spotify API 非法的redirect_uri

    我正在尝试完成 Spotify 开发人员 API 教程 但当我尝试访问用户登录页面时 出现此错误 我已经三次检查代码中的 URI 是否与 MyApplications 页面上的 URI 匹配 但它仍然无法工作 这是脚本 var expres
  • Python Eyed3 警告

    我的一些 mp3 文件似乎有非标准流派 当我循环遍历它们时 我必须在程序中执行此操作 我收到大量如下警告 eyed3 id3 WARNING Non standard genre name Rock Punk Pop Punk Rock A
  • django-simple-history 中 ManyToManyField 的历史

    简而言之 我需要在历史记录中保存对我的模型之一的多对多字段所做的更改 我可以从 https github com Kyruus django simple history commit 5ba8d2b4d72819f154a11f29779
  • 使用 automake 设置每个文件的标志

    有没有办法使用 automake 在每个文件的基础上设置标志 特别是 如果我有一个 C 项目 并且想要使用 W 编译除我想要禁用特定警告的文件之外的所有文件 我该怎么办 我尝试过类似的东西 CXXFLAGS WAll bin PROGRAM
  • Thread.suspend() 和 .resume() 的替代方法

    我有一大段代码不是循环 只是一个发生一次但需要一些时间的命令列表 我需要它根据不断变化的布尔值随时暂停或终止此操作 我可以使用不同的线程来挂起 恢复和停止此代码 但这些方法已被弃用 因此我想避免使用它们 我可以检查每行代码之间的布尔值 但我
  • PHP表单验证函数

    我目前正在编写一些 PHP 表单验证 我已经验证了客户端 并且有一些重复的代码 我认为这些代码在一个不错的 PHP 小函数中可以很好地工作 但是我很难让它工作 我确信这只是语法问题 但我无法确定它 任何帮助表示赞赏 Validate pho
  • 如何记录所有 Django 表单验证错误?

    在我的 Django 应用程序中 我有一个 forms py 文件 在其中定义了与表单输入屏幕对应的类负载 这些类中的每一个都在该属性 字段特定的 clean 函数中或在表单类的整体 clean 函数中进行一些验证 如果这些 clean 函
  • 清理整数数据库输入

    我有一个通过 POST 请求获取数据的应用程序 我正在使用这些数据将新行插入数据库 我知道使用mysql real escape string 加上删除 和 是处理字符串的方法 但是整数值呢 现在 我正在使用 PHP 函数intval 在他
  • Gradle 同步失败:com/intellij/openapi/util/io/FileUtil.toSystemIndependentName 的 @NotNull 参数“aFileName”的参数不能为 null

    我将我的项目导入到Android Studio 1 3 2现在显示错误 Gradle sync started Gradle sync failed Argument for NotNull parameter aFileName of c
  • git 构建期间“无法在 @INC 中找到 ExtUtils/MakeMaker.pm”

    我正在建造git在一个非常小的系统 Ubuntu 16 04 docker 镜像 上 不使用包管理器 除了wget xz utils make and gcc 因此 我安装先决条件如下 apt get update apt get inst
  • OS X Yosemite 中 ViewController 的动画自定义呈现

    我想实现新方法 我在 Google 和 Stack Overflow 上搜索了很多 但没有找到示例 void presentViewController NSViewController viewController animator id
  • 向重写方法 E_STRICT 观察添加参数

    It appears PHP 5 3 that if you are overriding a class method it is okay to you can add additional parameters as long as
  • HTML5 文档类型定义在哪里?

    旧 HTML XHTML 标准为其定义了 DTD 文档类型定义 HTML 4 01http www w3 org TR html401 sgml dtd htmlXHTML 1 0http www w3 org TR xhtml1 dtds
  • 命名空间“clr-namespace:ABC”中不存在名称“XYZ”

    我正在致力于创建一些标记扩展 并开始出现非常奇怪的 VS 行为 我已在单独的解决方案中提取并查明了该问题 问题是 VS 无法在 XAML 中创建 CLR 对象 这里是 View
  • 如何使用同一域在 NGINX 服务器上运行 django 和 wordpress?

    我尝试了很多方法但不知道如何运行example com 上的 Django and example com blog 上的 WordPress 以下是 Django 和 Wordpress 的运行项目目录结构 Django 应用程序目录 h
  • 在 netbeans 中添加其他项目作为库

    我有一个项目 A 例如基于 Ant 的 Java 应用程序项目 和第二个项目 B 一个 Java 类库项目或另一个 Java 应用程序项目 两者都基于 Ant 构建 项目 B 有一些额外的 Java 库依赖项 Libraries 文件夹中的
  • 使用 git 中的 cparse 库解析用户输入的字符串

    我是 C 编程新手 希望使用解析库在这里找到https github com cparse cparse在我的项目中 我想解释用户输入的字符串 例如 a b 3 对于变量a and b 并在不同的输入集上重复使用它作为函数 例如 将文本文件
  • 使用 WindowManager.LayoutParams.TYPE_KEYGUARD 时,最小目标必须小于 14

    我试图防止状态栏扩展 并且我使用了一些人们试图覆盖主页按钮的示例 所有解决方案都指向使用WindowManager LayoutParams TYPE KEYGUARD 我读here 如果使用 TYPE KEYGUARD 则最小目标必须小于