当我尝试使用WindowManager创建系统范围的叠加层并获得相应的权限时,我一直收到此异常:
Unable to add window android.view.ViewRootImpl$W@6b3c898 -- the specified window type is not valid
我的代码(从我的关于创建的活动开始):
if(Build.VERSION.SDK_INT >= 23) {
/** check if we already have permission to draw over other apps */
if (!Settings.canDrawOverlays(this)) {
/** if not construct intent to request permission */
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
/** request permission via start activity for result */
startActivityForResult(intent, CHECK_OVERLAY_PERMISSION_REQUEST_CODE);
}
}
if(Build.VERSION.SDK_INT >=23 && Settings.canDrawOverlays(this)) {
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
PixelFormat.TRANSLUCENT
);
View overlay = ((LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE)).inflate(R.layout.overlay_playback_controls, null);
//overlay.setOnClickListener(this);
windowManager.addView(overlay, layoutParams);
}
如果需要,可以使用相应的xml-layout文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Test!!!"
/>
</LinearLayout>
我已经尝试过这篇文章中的所有提示(包括链接的提示),但仍然不知道问题是什么:Unable to add window android.view.ViewRoot$W@44da9bc0 -- permission denied for this window type
答案 0 :(得分:1)
我自己找到了答案:
没有宽度和高度属性的视图不能存在,这就是为什么它没有运行。我根本不理解LayoutParams构造函数。
答案 1 :(得分:0)
我用这种方式解决了问题:
layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
我认为WindowManager.layoutParams
必须有类型。
答案 2 :(得分:0)
此异常是从ViewRootImpl.class抛出的
原因是当您创建LayoutParams时,它必须是WindowManager.LayoutParams的实例,并且您必须设置正确的flgas。 构造函数参数不是宽度和高度,有某种标记。 否则你应该得到这个例外。 当Activity对象创建然后活动创建新的 PhoneWindow 对象时,它是窗口的子类。 PhoneWindow创建Window Manager。您可以通过从actvity调用 getWindowManager()来获取。
根视图由WindowManager创建;
第599行
case WindowManagerGlobal.ADD_INVALID_TYPE:
throw new
WindowManager.InvalidDisplayException(
"Unable to add window " + mWindow
+ " -- the specified window type is not
valid");
这是该例外的一个例子
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.word_detail_activity);
TextView textView = new TextView(this);
textView.setText("Hello");
textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
textView.setBackgroundColor(Color.GRAY);
WindowManager manager = getWindowManager();
manager.addView(textView,new WindowManager.LayoutParams(-1,-1));
此代码正在运行,没有异常
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.format = PixelFormat.TRANSLUCENT;
params.gravity = Gravity.START | Gravity.TOP;
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.packageName = getPackageName();
WindowManager manager = getWindowManager();
manager.addView(textView, params);