本文共 4074 字,大约阅读时间需要 13 分钟。
我的这个报错,和网上的报错,所依附的 activity 不太一样,之前还延时创建 悬浮窗,但是没用。
01-04 07:04:25.319 30523-30523/com.fadisu.cpurun E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.fadisu.cpurun, PID: 30523android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:783) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:359) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93) at com.fadisu.cpurun.fragment.CpuStatusFragment.showFloatWindow(CpuStatusFragment.java:260) at com.fadisu.cpurun.fragment.CpuStatusFragment.onClick(CpuStatusFragment.java:210) at android.view.View.performClick(View.java:6300) at android.view.View$PerformClick.run(View.java:24941) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6523) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:857)
mParams.type = WindowManager.LayoutParams.TYPE_TOAST; 这句出问题了
改成
mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
就好了,可是想要达到不需要权限申请的悬浮窗啊?,如何两全其美
private void showFloatWindow() { mResultTv = new TextView(mContext); mResultTv.setBackgroundColor(mContext.getColor(R.color.float_bg)); mResultTv.setTextColor(mContext.getColor(R.color.white)); mResultTv.setOnTouchListener(new View.OnTouchListener() { int lastX = 0; int lastY = 0; int paramX = 0; int paramY = 0; @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) motionEvent.getRawX(); lastY = (int) motionEvent.getRawY(); paramX = mParams.x; paramY = mParams.y; break; case MotionEvent.ACTION_MOVE: int dx = (int) motionEvent.getRawX() - lastX; int dy = (int) motionEvent.getRawY() - lastY; mParams.x = paramX + dx; mParams.y = paramY + dy; // update float window mWm.updateViewLayout(mResultTv, mParams); break; } return true; } }); mParams = new WindowManager.LayoutParams(); mParams.width = WindowManager.LayoutParams.WRAP_CONTENT; mParams.height = WindowManager.LayoutParams.WRAP_CONTENT; // 悬浮窗的核心 mParams.type = WindowManager.LayoutParams.TYPE_TOAST; // 设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作) mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; mParams.format = PixelFormat.TRANSPARENT; mWm.addView(mResultTv, mParams); } private void hideFloatWindow() { mWm.removeView(mResultTv); }
so,还需要只加权限
private static final int REQUEST_CODE = 1; //判断权限 private boolean isCanDrawOverlays(Context context) { Boolean result = true; if (Build.VERSION.SDK_INT >= 23) { try { Class clazz = Settings.class; Method canDrawOverlays = clazz.getDeclaredMethod("canDrawOverlays", Context.class); result = (Boolean) canDrawOverlays.invoke(null, context); } catch (Exception e) { e.printStackTrace(); } } return result; } //申请权限 private void requestAlertWindowPermission() { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); intent.setData(Uri.parse("package:" + mContext.getPackageName())); startActivityForResult(intent, REQUEST_CODE); }
AndroidManifest.xml
转载地址:http://rlcti.baihongyu.com/