【问题标题】:I am trying to show floating activity and it is working but the problem appears on less than API 24我正在尝试显示浮动活动并且它正在工作,但问题出现在 API 24 以下
【发布时间】:2021-10-13 20:16:00
【问题描述】:
2021-08-10 10:21:03.685 4272-4288/com.hamid.almusabaha E/libEGL: load_driver(/system/lib/egl/libGLES_emulation.so): dlopen failed: library "/system/lib/egl/libGLES_emulation.so" not found
2021-08-10 10:21:05.530 4272-4272/com.hamid.almusabaha E/ActivityThread: Failed to find provider info for com.google.android.gms.chimera
2021-08-10 10:21:06.564 4272-4343/com.hamid.almusabaha E/libEGL: validate_display:99 error 3008 (EGL_BAD_DISPLAY)
2021-08-10 10:21:06.570 4272-4332/com.hamid.almusabaha E/cr_SBApiBridge: Failed to init handler: Attempt to invoke virtual method 'java.lang.reflect.Constructor java.lang.Class.getDeclaredConstructor(java.lang.Class[])' on a null object reference
2021-08-10 10:21:11.302 4272-4272/com.hamid.almusabaha E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.hamid.almusabaha, PID: 4272
    android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:679)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
        at com.hamid.almusabaha.Musbiha_Large$7.run(Musbiha_Large.java:185)
        at android.app.Activity.runOnUiThread(Activity.java:5866)
        at com.hamid.almusabaha.Musbiha_Large.showFloatView(Musbiha_Large.java:179)
        at com.hamid.almusabaha.MainActivity$20.onClick(MainActivity.java:318)
        at android.view.View.performClick(View.java:5637)
        at android.view.View$PerformClick.run(View.java:22429)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

【问题讨论】:

    标签: floating


    【解决方案1】:

    这是我的活动

    public class Musbiha_Large {
    
        private static boolean mIsFloatViewShowing;
    
        private Activity mActivity;
        private WindowManager mWindowManager;
        private View mFloatView;
        private WindowManager.LayoutParams mFloatViewLayoutParams;
        private boolean mFloatViewTouchConsumedByMove = false;
        private int mFloatViewLastX;
        private int mFloatViewLastY;
        private int mFloatViewFirstX;
        private int mFloatViewFirstY;
        static   LinearLayout coverLargeL;
    
         private int numpr = 0;
        boolean isDark = false;
        boolean isPha = false;
    
         public
         Musbiha_Large(final Activity activity) {
            mActivity = activity;
            LayoutInflater inflater = LayoutInflater.from(activity);
            mFloatView = inflater.inflate(R.layout.musbiha_large, null);
             final TextView   textNbrLarge = mFloatView. findViewById (  R.id.textNbrLarge );
             final ImageView  PlayLarge = mFloatView. findViewById (  R.id.PlayLarge );
             final  ImageView  lightLarge = mFloatView. findViewById (  R.id.lightLarge );
             final    ImageView  ResetLarge = mFloatView. findViewById (  R.id.ResetLarge );
             final LinearLayout  lirarlightLarge = mFloatView. findViewById (  R.id.lirarlightLarge );
             final  ImageButton exetLarge = mFloatView.findViewById(R.id.exetLarge);
             final   ImageButton plph = mFloatView.findViewById(R.id.plph);
    
             coverLargeL = mFloatView.findViewById(R.id.
    coverLargeF);
    
      
         
    
    
    
            exetLarge.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dismissFloatView();
                }
            });
    
            mFloatView.setOnClickListener(mFloatViewOnClickListener);
            mFloatView.setOnTouchListener(mFloatViewOnTouchListener);
    
            mFloatViewLayoutParams = new WindowManager.LayoutParams();
            mFloatViewLayoutParams.format = PixelFormat.TRANSLUCENT;
            mFloatViewLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
    
            mFloatViewLayoutParams.type = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
                    ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
                    : WindowManager.LayoutParams.TYPE_TOAST;
    
            mFloatViewLayoutParams.gravity = Gravity.CENTER;
            mFloatViewLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
            mFloatViewLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
    
        }
    
    
    
        public void dismissFloatView() {
            if (mIsFloatViewShowing) {
                mIsFloatViewShowing = false;
                mActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (mWindowManager != null) {
                            mWindowManager.removeViewImmediate(mFloatView);
                        }
                    }
                });
            }
        }
    
        public void showFloatView() {
            if (!mIsFloatViewShowing) {
                mIsFloatViewShowing = true;
                mActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (!mActivity.isFinishing()) {
                            mWindowManager = (WindowManager) mActivity.getSystemService(WINDOW_SERVICE);
                            if (mWindowManager != null) {
                                mWindowManager.addView(mFloatView, mFloatViewLayoutParams);
                            }
                        }
                    }
                });
            }
        }
    
         private View.OnClickListener mFloatViewOnClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                      //  Toast.makeText(mActivity, "Float view is clicked!", Toast.LENGTH_SHORT).show();
    
                  //    sbha.setBackgroundResource ( R.drawable.green );
    
                    }
                });
            }
        };
    
         private View.OnTouchListener mFloatViewOnTouchListener = new View.OnTouchListener() {
    
             @TargetApi(Build.VERSION_CODES.FROYO)
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                WindowManager.LayoutParams prm = mFloatViewLayoutParams;
                int totalDeltaX = mFloatViewLastX - mFloatViewFirstX;
                int totalDeltaY = mFloatViewLastY - mFloatViewFirstY;
    
                switch (event.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                        mFloatViewLastX = (int) event.getRawX();
                        mFloatViewLastY = (int) event.getRawY();
                        mFloatViewFirstX = mFloatViewLastX;
                        mFloatViewFirstY = mFloatViewLastY;
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                    case MotionEvent.ACTION_MOVE:
                        int deltaX = (int) event.getRawX() - mFloatViewLastX;
                        int deltaY = (int) event.getRawY() - mFloatViewLastY;
                        mFloatViewLastX = (int) event.getRawX();
                        mFloatViewLastY = (int) event.getRawY();
                        if (Math.abs(totalDeltaX) >= 5 || Math.abs(totalDeltaY) >= 5) {
                            if (event.getPointerCount() == 1) {
                                prm.x += deltaX;
                                prm.y += deltaY;
                                mFloatViewTouchConsumedByMove = true;
                                if (mWindowManager != null) {
                                    mWindowManager.updateViewLayout(mFloatView, prm);
                                }
                            } else {
                                mFloatViewTouchConsumedByMove = false;
                            }
                        } else {
                            mFloatViewTouchConsumedByMove = false;
                        }
                        break;
                    default:
                        break;
                }
                return mFloatViewTouchConsumedByMove;
            }
        };
    

    【讨论】:

    • 您找到解决方案了吗?因为我面临同样的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2021-06-14
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多