Android: permission denied for window type 2038 using TYPE_APPLICATION_OVERLAY

前端 未结 6 1622
礼貌的吻别
礼貌的吻别 2020-12-10 02:28

I trying to create a view that is above other applications:

WindowManager.LayoutParams paramsDirectorView = new WindowManager.LayoutParams(
        WindowMan         


        
6条回答
  •  死守一世寂寞
    2020-12-10 02:50

    
    

    I had the exactly same issue in service class(before and after Marshmallow).

    if (Build.VERSION.SDK_INT >= 23) {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
              Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, 1234);
        }
    } else {
        startService(new Intent(SplashActivity.this,                     
        CheckServicesForApps.class));
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1234) {
                startService(new Intent(SplashActivity.this, 
                CheckServicesForApps.class));
    
        }
    }
    
    public class CheckServicesForApps extends Service {
        private Context context = null;
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            ImageView imageView = new ImageView(context);
            imageView.setVisibility(View.GONE);
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                try {
                    windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
    
                    //here is all the science of params
                    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                            WindowManager.LayoutParams.WRAP_CONTENT,
                            WindowManager.LayoutParams.WRAP_CONTENT,
                            WindowManager. LayoutParams.TYPE_SYSTEM_ERROR,
                            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                            PixelFormat.TRANSLUCENT
                    );
    
                    windowManager.addView(imageView, params);
                    hand=new Handler();
    
                } catch (Exception e) {
                    hand=new Handler();
                    e.printStackTrace();
                }
            }else{
                windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    
                final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                        WindowManager.LayoutParams.WRAP_CONTENT,
                        WindowManager.LayoutParams.WRAP_CONTENT,
                        WindowManager.LayoutParams.TYPE_PHONE,
                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                        PixelFormat.TRANSLUCENT);
    
                params.gravity = Gravity.TOP | Gravity.CENTER;
                params.x = ((getApplicationContext().getResources().getDisplayMetrics().widthPixels) / 2);
                params.y = ((getApplicationContext().getResources().getDisplayMetrics().heightPixels) / 2);
                windowManager.addView(imageView, params);
            }
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            /* We want this service to continue running until it is explicitly
            * stopped, so return sticky.
            */
            return START_STICKY;
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
    
            if (imageView != null) {
                try {
                    windowManager.removeView(imageView);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            /**** added to fix the bug of view not attached to window manager ****/
        }
    }
    

提交回复
热议问题