棉花糖或更高版本的Windows类型2010的Android权限被拒绝 [英] Android permission denied for window type 2010 in Marshmallow or higher

查看:911
本文介绍了棉花糖或更高版本的Windows类型2010的Android权限被拒绝的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使 Chathead 类型在我的应用程序上通过Android服务过度绘制,例如波纹管图像.

I am try to make Chathead type overly draw via Android Service on my app like bellow image.

此聊天头应用程序可在Android版本5或更低版本(kitkat,棒棒糖等)上运行.但是我正在棉花糖和更高版本中尝试使用,然后出现此错误.

This chat head app works on Android Version 5 or lower versions(kitkat,lollipop etc).But I am trying it in Marshmallow and higher versions,Then get this error.

 android.view.WindowManager$BadTokenException: Unable to add window
 android.view.ViewRootImpl$W@48f5767 -- permission denied for window type 2010

聊天头代码

注意:我正在从Android服务中调用此函数

权限列表:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

private WindowManager windowManager;
private ImageView chatHead;
WindowManager.LayoutParams params;

@Override
    public void onCreate() {
        super.onCreate();
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        chatHead = new ImageView(this);
        chatHead.setImageResource(R.drawable.settingsicon);
        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.LEFT;
        params.x = 0;
        params.y = 100;
        windowManager.addView(chatHead, params);

        chatHead.setOnTouchListener(new View.OnTouchListener() {
            private int initialX;
            private int initialY;
            private float initialTouchX;
            private float initialTouchY;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        initialX = params.x;
                        initialY = params.y;
                        initialTouchX = event.getRawX();
                        initialTouchY = event.getRawY();                       
                        return true;
                    case MotionEvent.ACTION_UP:                        
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        params.x = initialX + (int) (event.getRawX() - initialTouchX);
                        params.y = initialY + (int) (event.getRawY() - initialTouchY);
                        windowManager.updateViewLayout(chatHead, params);
                        return true;
                }
                return false;
            }
        }
    }

如何在Mashmallow或更高版本的android系统上解决此错误?

How to resolve this error on Mashmallow or higher android versions ?

推荐答案

在显示聊天标题之前,请调用此方法以请求权限:

Call this method to ask for permission before showing chat head:

 public void addOverlay() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.canDrawOverlays(this)) {
            askedForOverlayPermission = true;
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, OVERLAY_PERMISSION_CODE);
        }
    }
}

在许可结果之后,如果用户允许许可,则只有您可以显示聊天头,如下所示:

after that on Permission result if user allows for permission then only you can show chat head like below:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == OVERLAY_PERMISSION_CODE) {
        askedForOverlayPermission = false;
        if (Settings.canDrawOverlays(this)) {
            // SYSTEM_ALERT_WINDOW permission not granted...
            //Toast.makeText(MyProtector.getContext(), "ACTION_MANAGE_OVERLAY_PERMISSION Permission Granted", Toast.LENGTH_SHORT).show();
            Intent serviceIntent = new Intent(Homepage.this, ChatHeadService.class);
            serviceIntent.putExtra("removeUserId", friendId);
            startService(serviceIntent);

        } else {
             Toast.makeText(MyProtector.getContext(), "ACTION_MANAGE_OVERLAY_PERMISSION Permission Denied", Toast.LENGTH_SHORT).show();
        }
    }

让我知道它是否对您有帮助...祝您好运.

Let me know if it helps you... best of luck.

这篇关于棉花糖或更高版本的Windows类型2010的Android权限被拒绝的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆