- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
粘性是指调用启动器 Intent (intent.addCategory(Intent.CATEGORY_HOME
) 时不会关闭的窗口。
以前这是使用 WindowManager.LayoutParams.TYPE_PHONE
完成的,但现在已弃用此类型并在 api 28 上引发异常:
WindowManager$BadTokenException ... permission denied for window type 2002
这种行为仍然是可能的,因为 Facebook 的 Messenger 使用它的聊天“Heads”来实现它,这是基于 Facebook 没有获得系统应用程序权限的假设,因为它预装在很多 rom 上。
使用 WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
不起作用(即按下主页按钮也会隐藏覆盖窗口)。
编辑:问题是当用户点击主页按钮/调用启动器 Intent 时,如何有一个不会被删除的覆盖窗口。 TYPE_APPLICATION_OVERLAY
不是这种情况,TYPE_PHONE
是这种情况,但已弃用。
编辑 2: 显然这对某些人有用,这是我正在运行的代码:
class MyClass {
var params: WindowManager.LayoutParams = WindowManager.LayoutParams(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
else WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT
).apply {
windowAnimations = android.R.style.Animation_Dialog
gravity = Gravity.CENTER or Gravity.CENTER
x = 0
y = 0
}
var windowManager: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
init {
val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
rootView = layoutInflater.inflate(R.layout.view_overlay, null)
windowManager.addView(rootView, params)
}
}
最佳答案
引用:https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html
TYPE_PHONE
public static final int TYPE_APPLICATION_OVERLAY
此常量在 API 级别 26 中已弃用。
适用于非系统应用。请改用 TYPE_APPLICATION_OVERLAY。
窗口类型:电话。 这些是提供用户与电话交互的非应用程序窗口
(特别是来电)。这些窗口通常位于所有应用程序的上方,但位于状态栏的后面。在多用户系统中显示在所有用户的窗口上。
TYPE_APPLICATION_OVERLAY
public static final int TYPE_APPLICATION_OVERLAY
窗口类型:应用程序覆盖窗口显示在所有 Activity 窗口上方(类型介于 FIRST_APPLICATION_WINDOW
和 LAST_APPLICATION_WINDOW
之间),但在状态栏或 IME 等关键系统窗口下方。
系统可以随时更改这些窗口的位置、大小或可见性,以减少用户的视觉困惑并管理资源。
需要 Manifest.permission.SYSTEM_ALERT_WINDOW
权限。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
系统将调整具有此窗口类型的进程的重要性,以减少低内存 killer 杀死它们的机会。
在多用户系统中仅显示在拥有用户的屏幕上。
我们必须在设备 Oreo 或更高版本上使用 TYPE APPLICATION OVERLAY我们已经给出了 Manoj Perumarath 的例子
你需要像这样定义窗口布局参数
//if device is Oreo or latter if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
//or else
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
Manifest.xml
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
//...other stuff
<service
android:name=".serviceClass"
android:enabled="true"
android:exported="false"/>
MainActivity
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, APP_PERMISSION_REQUEST);
}
else
{
//start service
}
读一遍
关于java - 没有 WindowManager.LayoutParams.TYPE_PHONE 的粘性覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55251502/
我试图在 2 个小部件/布局之间创建一个 float 操作按钮 我 99% 确定我已经使用了这个教程并且有效 How can I add the new "Floating Action Button
这是 XML 代码,
因为它可以与Relative 或Linear 布局一起使用。因此,如果我们稍后将 RelativeLayout 更改为 LinearLayout,它可能会很有用。 LinearLayout.Layou
我正在尝试开发 Android 3.1 平板电脑应用程序。 这个app会有很多图片,我已经关注了Processing Bitmaps Off the UI Thread教程,但我做错了,因为我得到:
我的初始代码行位于重写方法 onGlobalLayout() 中: img.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 10
我正尝试按照发布在以下位置的示例编写周历: How can I create a weekly calendar view for an Android Honeycomb application?
这段代码似乎适用于 android api 16 - 22,但不适用于 api 23。我只是想显示一个带有选项的弹出窗口,并使弹出窗口下方的背景变暗: WindowPo
带有 Android Studio 2.0 的 OS X Yosemite 10.10.5 出于教学目的,我想将尽可能多的 View 属性从 XML 移动到 Java。 我在 GridLayout 中
说明及解决方法在底部。 我正在开发一个 slider 布局动画,动画效果很好,但是当所有进程结束时,它们会得到下一个异常。 我猜 RelativeLayout 父级在异常中有一些事情要做,但我不知道如
我正在尝试创建一个 FloatingActionButton,如 this , 但是当我运行应用程序时出现以下错误 java.lang.ClassCastException: android.wid
根据大量教程和示例项目,我得到了以下代码,它应该用包含来自 Line 对象的多个值的行填充 ListView。 作为一名新手程序员,我一辈子都弄不明白我的代码到底哪里出错了。任何帮助将不胜感激! 如果
我得到了这个异常(exception): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cas
Android Studio 3.1、Java 1.8、Gradle 4.1。我使用 minVersion = 15 我想在文件 profile_category_active.xml 中以编程方式设
我正在尝试使我的整个布局(其中包含 ListView)可滚动。也就是说,整个布局应该拥有滚动条,而不仅仅是 ListView。我正在尝试使用 commonsguy 的 MergeAdapter ( h
我遇到了以下错误 java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to an
还有其他相关问题,但它们没有解决我的情况(它们的错误代码与客户端代码的某种回收和/或错误的转换调用有关)。 我的情况比较复杂。 我有一些代码,用户可以在其中调出照片库。 问题是,它在我拥有的 7 部手
我正在尝试做抽屉导航选项。 这是我的 xml: 如果我删除 Linearlayout
我正在尝试获取 AppBarLayout 的布局参数,但出现此错误。 java.lang.ClassCastException: android.support.design.widget.Coord
我使用一个具有RelativeLayout -> ScrollView -> LinearLayout 的 View 。我得到了异常(exception): 11-22 11:17:24.605: E
我在调试我正在处理的 Android 应用程序时遇到了问题。目前,它应该能够从文本文件中获取输入(它可以),将其转换为包含表示网格部分的 Cell 对象的 ArrayList(它确实如此),然后使用
我是一名优秀的程序员,十分优秀!