首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓操作系统6专用设备上的WindowManager崩溃

安卓操作系统6专用设备上的WindowManager崩溃
EN

Stack Overflow用户
提问于 2015-12-10 11:30:34
回答 1查看 2.4K关注 0票数 1

我正在使用一个服务来创建一个facebook信使风格的chatHead。我的代码在使用android的设备上运行良好,直到6(Marshmallow)。但是在M设备上,代码在windowManager.addView()上运行时异常崩溃。

守则如下:

代码语言:javascript
复制
windowManager = (WindowManager) ctx.getSystemService(WINDOW_SERVICE);
callHead = new ImageView(this);
callHead.setImageResource(R.drawable.ic_flow_flat);
params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            PixelFormat.TRANSLUCENT);

params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
            | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
            | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;     
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
params.height = 120; // given it a fixed height in case of large image
params.width = 120;
windowManager.addView(callHead, params);

我收到的撞击是

代码语言:javascript
复制
Caused by: android.view.WindowManager$InvalidDisplayException: Unable to add window android.view.ViewRootImpl$W@b40f577 -- the specified window type is not valid
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-10 13:56:11

在看了http://qiita.com/chibatching/items/add5e50921c2da5ee1c7之后自己试了一下

检查您的代码是否运行在Marshmallow和上面。如果是,请检查应用程序是否有绘制覆盖层的权限。如果没有,则将用户引导到设置。在onActivityResult中,如果用户已授予权限,则可以调用displayOverdraw。如果用户先前已授予权限,则无需再次显示设置屏幕。

代码语言:javascript
复制
 public void checkdrawPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.canDrawOverlays(this)) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                        Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent, REQUEST_CODE_ASK_PERMISSIONS);
            } else {
                 // display over lay from service
            }
        }else
        {
             // display over lay from service
        }
    }

onActivityResult回调

代码语言:javascript
复制
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE_ASK_PERMISSIONS) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (Settings.canDrawOverlays(this)) {
                    // You have permission
                    // display over lay from service
                }
            }
        }
    }

服务中的绘制覆盖

代码语言:javascript
复制
public void displayOverdraw() {

    ImageView callHead = new ImageView(this);
    callHead.setImageResource(R.mipmap.ic_launcher);

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    wm.addView(callHead, params);
}

注意:为了进行测试,我在活动中尝试了这一点。在服务中,不能调用startActivityForResult

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34200765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档