标签: android-windowmanager

WindowManager $ BadTokenException无法添加窗口

我正在为背景录像开发应用程序,这就是为什么我使用WindowManager,但它对我没有用.以下错误:

08-23 15:38:21.021: E/AndroidRuntime(4200): java.lang.RuntimeException: Unable to create service com.example.prankapp.BackgroundVideoRecorder: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@418c0b68 -- permission denied for this window type
    08-23 15:38:21.021: E/AndroidRuntime(4200):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2277)
    08-23 15:38:21.021: E/AndroidRuntime(4200):     at android.app.ActivityThread.access$1600(ActivityThread.java:128)
    08-23 15:38:21.021: E/AndroidRuntime(4200):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1215)
    08-23 15:38:21.021: E/AndroidRuntime(4200):     at android.os.Handler.dispatchMessage(Handler.java:99)
    08-23 15:38:21.021: E/AndroidRuntime(4200):     at android.os.Looper.loop(Looper.java:137)
    08-23 15:38:21.021: E/AndroidRuntime(4200):     at android.app.ActivityThread.main(ActivityThread.java:4517)
    08-23 15:38:21.021: E/AndroidRuntime(4200):     at java.lang.reflect.Method.invokeNative(Native Method)
    08-23 15:38:21.021: E/AndroidRuntime(4200):     at java.lang.reflect.Method.invoke(Method.java:511)
    08-23 15:38:21.021: E/AndroidRuntime(4200):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
    08-23 15:38:21.021: E/AndroidRuntime(4200):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
    08-23 15:38:21.021: E/AndroidRuntime(4200):     at …
Run Code Online (Sandbox Code Playgroud)

android android-camera android-windowmanager

14
推荐指数
2
解决办法
2万
查看次数

PopupWindow z订购

我使用PopupWindow播放菜单,它与EditText重叠.

它工作正常,只是我的PopupWindow与EditText IME系统中的一些项目重叠(选择标记,粘贴按钮).

我的问题是:如何强制我的PopupWindow的z排序,使它出现在那些装饰上面?

这是正在发生的事情的形象.我需要在所有内容之上绘制我的PopupWindow(菜单),从而以某种方式告诉WindowManager如何订购窗口.谢谢.

在此输入图像描述

android popupwindow android-windowmanager

13
推荐指数
1
解决办法
3866
查看次数

TYPE_TOAST替代方案不会请求权限?

我正在开发一个SDK,它WindowManager使用TYPE_TOAST LayoutParams类型放置弹出视图.最新版本的Android Nougat(7.1.1)做了一些更改WindowManager(我还不知道究竟有什么变化 - 如果有人可以详细说明会很感激)但是这个更改会导致所有添加了TYPE_TOAST类型的视图被删除从活动过渡后的窗口.

我无法添加任何权限请求,因此我无法使用需要SYSTEM_ALERT_WINDOW权限的类型.

尝试在每次转换后添加视图,但这些视图几乎在我添加后立即删除.(再次,我猜测是因为做了一些改变WindowManager)

所以问题是:只要应用程序处于活动状态并且在前台上,是否有人知道我可以使用一些替代方法将弹出视图显示为应用程序上的叠加层?

android overlay view android-windowmanager android-7.1-nougat

13
推荐指数
0
解决办法
895
查看次数

ICS中的TYPE_SYSTEM_OVERLAY

在Honeycomb中,我能够使用TYPE_SYSTEM_OVERLAY创建系统覆盖,并使用FLAG_WATCH_OUTSIDE_TOUCH接收触摸.

现在ICS改变了一些东西.我仍然可以创建系统覆盖,但我无法接触.

现在,我能够使用TYPE_SYSTEM_ALERT创建相同的内容并获取触摸,但它只是捕获touchevents,而不是像Honeycomb那样传递它们.

有任何想法吗?

亲切的问候

android layoutparams android-windowmanager android-4.0-ice-cream-sandwich

12
推荐指数
2
解决办法
1万
查看次数

如何向Android窗口管理器添加浮动视图并侦听系统/硬件后退按钮事件

我有一个服务,在窗口管理器上显示浮动视图(使用WINDOW_TYPE_ALERT权限).我能够显示它并执行操作.但是,我有两个具体问题:

  1. 关于浮动视图的实现
  2. 如何监听系统后退按钮事件,以便我可以关闭视图.

执行:

在清单中,我添加了以下权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Run Code Online (Sandbox Code Playgroud)

我有一个广播接收器,它将监听报警事件.收到活动后,我正在启动服务以显示浮动视图.以下是我用来创建视图的代码.

LayoutParams layOutParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);
Run Code Online (Sandbox Code Playgroud)

每当用户对视图执行任何操作时,我都会从窗口管理器中删除该视图并终止该服务.

我想知道的是 - 如果这是解决问题的正确方法,或者有更好的方法吗?而且,我应该对LayoutParams进行更改还是保持原样?

其次,当有SYSTEM BACK/HARDWARE BACK按钮按下事件时,我还想忽略这个浮动视图.有关如何执行此操作的任何指示都会有所帮助.

附上浮动视图的屏幕截图以便更好地理解:

浮动视图

android android-service android-windowmanager

12
推荐指数
2
解决办法
2万
查看次数

在锁定屏幕上使用windowmanager显示视图

我有一个漂浮在所有活动之上的浮动图标,但是当设备被锁定时,它会消失,直到设备解锁.

另一个意思是,我想在服务中使用windowmanager在锁定屏幕上显示一个视图(FloatIcon).

到目前为止这是我的代码.

public class FloatIcon extends Service {

    private WindowManager windowManager;
    private ImageView floatIcon;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        floatIcon = new ImageView(this);
        floatIcon.setImageResource(R.drawable.ic_launcher);
        floatIcon.setClickable(true);
        floatIcon.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getBaseContext(), MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                getApplication().startActivity(intent);
            }
        });

        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);

        params.gravity = Gravity.TOP | Gravity.LEFT;
        params.x = …
Run Code Online (Sandbox Code Playgroud)

android android-windowmanager

12
推荐指数
2
解决办法
4830
查看次数

什么是Android窗口中的"面板"?

Android窗口和相关页面的参考文档(例如,WindowManager.LayoutParams和Window.Callback)在很多地方引用"面板".例如,Window.Callback页面具有以下内容.

Window.Callback API从Window返回其调用者.这允许客户端拦截密钥调度,面板和菜单等.

public abstract查看onCreatePanelView(int featureId)

在API级别1中添加

实例化视图以在'featureId'面板中显示.您可以返回null,在这种情况下,将为您创建默认内容(通常是菜单).

参数featureId:正在创建哪个面板.

返回视图:要放置在面板中的顶级视图.

WindowManager.LayoutParams似乎将Panels视为Windows"类型",例如:

TYPE_APPLICATION_PANEL窗口类型:应用程序窗口顶部的面板.TYPE_APPLICATION_SUB_PANEL窗口类型:应用程序窗口顶部的子面板.TYPE_STATUS_BAR_PANEL窗口类型:从状态栏上滑出的面板在多用户系统中显示在所有用户的窗口上.TYPE_SYSTEM_DIALOG窗口类型:从状态栏滑出的面板在多用户系统中显示在所有用户的窗口上.

我也仔细阅读了源代码,但如果不花费数小时的时间就无法取得任何重大进展.

什么是Windows面板,如参考文档中所使用的那样?

在相关的说明中,featureId是什么?在上面的onCreatePanelView(int featureId)中,它似乎是用于指定面板的ID,但在其他上下文中,它似乎用于标识一组Windows功能,例如,用于Window.requestFeature():

public boolean requestFeature(int featureId)

在API级别1中添加

启用扩展屏幕功能.必须在setContentView()之前调用它.可以根据需要多次调用,只要它在setContentView()之前.如果未调用,则不会提供扩展功能.请求后,您无法关闭该功能.您可以使用FEATURE_CUSTOM_TITLE来使用其他标题功能.

参数featureId:所需的功能,由Window定义为常量.

返回:现在设置的功能.

谢谢,巴里

android android-windowmanager

12
推荐指数
1
解决办法
1489
查看次数

Android:在LockScreen上覆盖TextView

概念

我试图在LockScreen上叠加TextView(类似于Android覆盖时间的方式).

注意:我不想绕过锁屏,只是在它上面画画(不干扰任何触摸事件).

我尝试使用以下标志(在onCreate中):

getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    getWindow().addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
    getWindow().addFlags(PixelFormat.TRANSLUCENT);
Run Code Online (Sandbox Code Playgroud)

并应用以下主题(针对特定活动):

   <style name="Transparent">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:backgroundDimEnabled">false</item>
 <item name="android:windowIsFloating">true</item>   
</style>
Run Code Online (Sandbox Code Playgroud)

但这会占据锁定屏幕的TOP,隐藏锁屏并禁用所有触摸事件.

编辑:activity_overlay.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.coco.MainActivity" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@android:color/white"
    android:layout_alignParentBottom="true"
    android:text="TextView" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

活动的清单声明(膨胀overlay_activity.xml)

      <activity
        android:name=".DisplayActivity"
        android:label="@string/app_name"
        android:theme="@style/Transparent" />
Run Code Online (Sandbox Code Playgroud)

android overlay textview android-windowmanager

12
推荐指数
1
解决办法
6526
查看次数

Android ActivityManager与WindowManager

有人可以在下面详细解释,

1- What is the use of ActivityManager & WindowManager?
2- What is the difference between ActivityManager & WindowManager?
Run Code Online (Sandbox Code Playgroud)

android android-windowmanager android-activity

11
推荐指数
1
解决办法
1万
查看次数

为什么Application有时会在killProcess上重启?

通常,通过调用退出我的应用程序:

android.os.Process.killProcess(android.os.Process.myPid());
Run Code Online (Sandbox Code Playgroud)

表现良好而没有事故.

但每隔一段时间,应用程序将重新启动(退出后!).

相关的日志片段显示:

.631: I/Process(15495): Sending signal. PID: 15495 SIG: 9
.641: W/AudioFlinger(121): write blocked for 252 msecs, 1279 delayed writes, thread 0xdc18
.651: I/ActivityManager(164): Process com.ef.myapp (pid 15495) has died.
.651: I/WindowManager(164): WIN DEATH: Window{463659e8 com.ef.myapp/com.ef.myapp.MainActivity paused=false}
.661: I/AudioService(164):  AudioFocus  abandonAudioFocus() from android.media.AudioManager@460b2b98
.701: I/ActivityManager(164): Start proc com.ef.myapp for activity com.ef.myapp/.MainActivity: pid=15589 uid=10077 gids={3003}
Run Code Online (Sandbox Code Playgroud)

我知道,通过Android OS的设计,killProcess()不是终止应用程序的正确方法.这是因为killProcess()会立即停止进程,而不会给予应用程序阻止或准备它的任何方式或机会.

我知道当我调用finish()时,应用程序堆栈只是被推到后台(并且仍然存在于内存中).Android本身决定何时关闭应用程序(即从内存中删除其实例),通常这是在应用程序变为"最长时间未使用的最长时间"时完成的.如果它真的是最后一个,它的行为实际上更容易预测.

问题是finish()只会停止并销毁调用它的活动.它不会阻止应用程序或其他活动产生的其他活动.因此,为了便于在开发过程中进行测试和调试,我使用 killProcess()作为方便的快捷方式.

但是现在我看到这有副作用,有时候会在自杀之后立即重新启动 - …

android activity-lifecycle android-windowmanager android-activity

10
推荐指数
1
解决办法
6902
查看次数