[エラー]token null is not valid is your activity running

11727 ワード

1.異常ログ


私のこの新聞は間違っていて、ネット上の新聞と間違っていて、添付されているactivityはあまり違っていて、前に懸濁窓の作成を遅らせたが、役に立たなかった.
01-04 07:04:25.319 30523-30523/com.fadisu.cpurun E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.fadisu.cpurun, PID: 30523
android.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)

2.コードクリップ


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
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>