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

拒绝窗口类型2038的权限

欧阳飞
2023-03-14

我正在修复一个不是我开发的android应用程序,几天前,客户要求我将targetSdkVersion设置为26(在14之前),之后我注意到该应用程序在某些情况下崩溃,例如在显示ProgressDialog时崩溃。这是代码中存在此问题的部分:

mProgressDialog.setTitle(getString(R.string.downloading_data));
mProgressDialog.setMessage(mAlertMsg);
Drawable icon = getActivity().getDrawable(android.R.drawable.ic_dialog_info);
icon.setColorFilter(Color.parseColor("#00cbac"), PorterDuff.Mode.SRC_ATOP);
mProgressDialog.setIcon(icon);
mProgressDialog.setIndeterminate(true);
mProgressDialog.setCancelable(false);
mProgressDialog.setButton(getString(R.string.cancel), loadingButtonListener);
mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
mProgressDialog.show();

执行最后一行时,应用程序崩溃,并在Logcat中显示此错误:

android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@b784d3a -- permission denied for window type 2003

当应用程序在具有Android 8和9的设备中运行时,会出现此问题。我寻找类似问题的解决方案,我发现使用WindowManager会更好。LayoutParams.TYPE_APPLICATION_OVERLAY而不是TYPE_SYSTEM_ALERT,然后我html" target="_blank">修改了我在这篇文章中编写的代码的倒数第二行但它不会改变任何东西,应用程序崩溃相同并且在日志中出现此错误:

android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@b784d3a -- permission denied for window type 2038

在清单中,我有权:

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

我还从设备设置中启用了应用程序的所有权限。我怎样才能解决这个问题?

共有1个答案

秦斌
2023-03-14

正如您所见,Android Oreo及以上版本严格限制了允许使用的覆盖类型。Oreo为应用程序引入了新的TYPE_APPLICATION_OVERLAY常量,同时弃用和禁止使用旧常量。

但是,牛轧糖及其以下食品中不存在TYPE_APPLICATION_OVERLAY,因此尝试在那里使用它将导致安全异常。

替换

mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

随着

mProgressDialog.getWindow().setType(
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
        else 
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);

至于为什么它仍然在Oreo及以上的TYPE_APPLICATION_OVERLAY上崩溃,SYSTEM_ALERT_WINDOW权限不是正常的运行时权限,并且不会显示在应用信息中的“权限”部分下。它面向html" target="_blank">用户的名称是“Draw over other app”(通常),它位于通用应用信息页面下或设置下

您不能像运行时权限那样以编程方式授予它,您有一个简单的对话框来授予它。相反,您需要检查是否授予了权限,如果没有,则启动设置页面以允许用户授予它:如何在android中以编程方式授予“借鉴其他应用程序”权限?

然而,我真的不明白为什么一个简单的进度对话框需要是一个完整的覆盖。事实上,ProgressDialog已经被完全弃用了。您应该考虑迁移到一个简单的ProgressBar,或者,如果您想保留ProgressDialog,可以删除setType()行。

 类似资料:
  • 问题内容: 当我尝试运行简单的docker命令时,例如: 我收到一条错误消息: 获得权限被拒绝… /var/run/docker.sock:connect:权限被拒绝 当我检查权限 我看到这一行: 因此,我遵循许多论坛的建议并将本地用户添加到docker组: 但这无济于事。我仍然收到非常相同的错误消息。我该如何解决? 问题答案: 对于那些刚接触shell的人,命令: 需要在您的外壳中定义。默认情况

  • 问题内容: 尝试显示URI时出现以下异常。我认为这是在我的活动停止后发生的,我尝试再次访问可行的URI。还有其他问题可以解决这个问题,但是我对如何对我的代码应用任何解决方案感到非常困惑,因为我的takePhotoIntent允许拍照或从图库中选择图片(如下所示)。 我的createImageFile和我的takePhotoIntent: 问题答案: 根据Storage Access Framewo

  • 问题内容: 我对编码比较陌生,遇到了麻烦。 我有这段代码可以将数据发送到Firebase 但是,我不断收到错误: FIREBASE警告:设置为/ users /(GoogleID)失败:Permission_denied 2016-05-23 22:52:42.707 firebase.js:227未捕获(承诺)错误:PERMISSION_DENIED:权限被拒绝(…) 当我尝试查找时,它谈论的是

  • 问题内容: 很抱歉来到这里问这个问题,但是我已经读完了所有互联网,试图找到解决方案,但是我仍然遇到这个问题… 我已经成功安装了Jenkins(让我在仍有希望的时候开始)可以在我们的持续集成流程中使用它。 我试图从这样一个简单的例子开始: 但是每次启动时,都会出现此错误: 问题在于用户jenkins(服务和主节点以Jenkins的身份运行)拥有此存储库上的所有权限。我试图授予组和其他人读取和执行的权

  • 问题内容: 我正在尝试将查询写入文件以进行调试。该文件位于中。我要写入的文件是。 我正在尝试使用 但是我越来越 file_put_contents(queries.txt)[function.file-put-contents]:无法打开流:权限被拒绝 我的文件chmod’d为777,可能是什么问题? 问题答案: 尝试调整目录权限。 在终端上运行(从包含数据库文件夹的目录中运行) apache,如