在service中通过WindowManager创键自定义view的时候出现如下错误:
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
百度了一下也没有找到有效的解决办法,后来发现是自己的代码出现了问题,在设置WindowManager.LayoutParams时必须指定layoutParams.type,然后再addView。
layoutParams = new WindowManager.LayoutParams();
layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;// 该类型提供与用户交互,置于所有应用程序上方,但是在状态栏后面
//layoutParams.type = -2; //这个是android系统的漏洞,不需要申请创建android.permission.SYSTEM_ALERT_WINDOW(悬浮窗)的权限
layoutParams.gravity = Gravity.LEFT | Gravity.TOP; // 调整悬浮窗口至左上角
<span style="white-space:pre"> </span>layoutParams.width = 150;
<span style="white-space:pre"> </span>layoutParams.height = 150;
<span style="white-space:pre"> </span>layoutParams.format = PixelFormat.RGBA_8888;
<span style="white-space:pre"> </span>final MyFloatView view = new MyFloatView(this);
<span style="white-space:pre"> </span>windowManager.addView(view, layoutParams);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>view.setOnTouchListener(new OnTouchListener() {
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public boolean onTouch(View v, MotionEvent event) {
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>rawx = (int) event.getRawX();
<span style="white-space:pre"> </span>rawy = (int) event.getRawY();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>int action = event.getAction();
<span style="white-space:pre"> </span>switch(action){
<span style="white-space:pre"> </span>case MotionEvent.ACTION_DOWN:
<span style="white-space:pre"> </span>x = (int) event.getX();
<span style="white-space:pre"> </span>y = (int) event.getY();
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>case MotionEvent.ACTION_MOVE:
<span style="white-space:pre"> </span>layoutParams.x = -x + rawx;
<span style="white-space:pre"> </span>layoutParams.y = -y + rawy;
<span style="white-space:pre"> </span>windowManager.updateViewLayout(view, layoutParams);
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>});