我试图像我的波纹管图像一样通过我的应用程序上的Android服务过度绘制Chathead类型.
这个聊天头应用程序可在AndroID版本5或更低版本(kitkat,lollipop等)上运行.但是我正在棉花糖和更高版本中尝试使用,然后出现此错误.
androID.vIEw.WindowManager$BadTokenException: Unable to add window androID.vIEw.VIEwRootImpl$W@48f5767 -- permission denIEd for window type 2010
聊天头代码
注意:我正在从AndroID Service调用此函数
权限列表:
<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上的此错误?
解决方法:
在显示聊天标题之前,请调用此方法以请求许可:
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); } }}
在许可结果上,如果用户允许许可,则只有您可以显示聊天头,如下所示:
@OverrIDeprotected 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(); } }
让我知道它是否对您有帮助…祝您好运.
总结以上是内存溢出为你收集整理的棉花糖或更高版本的Windows类型2010的Android权限被拒绝全部内容,希望文章能够帮你解决棉花糖或更高版本的Windows类型2010的Android权限被拒绝所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)