今天开发android时遇到这样一个问题:
android.view.ViewRootImpl$W@20e5d20 -- permission denied for window type 2003
这个原因是我想要用系统悬浮弹框,但是没有权限;
fun showDialog(){ var dialog:AlertDialog.Builder = AlertDialog.Builder(this) var alear:AlertDialog =dialog.setIcon(R.drawable.ic_launcher_background).setTitle(R.string.app_name) .setMessage(R.string.msg).setPositiveButton(R.string.ok, object : DialogInterface.OnClickListener { override fun onClick(p0: DialogInterface?, p1: Int) { Log.e("kotlin","button_click") } }).create() alear.window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT) alear.show() }
这是我代码,代码提示TYPE_SYSTEM_ALERT 已经过时,于是在网上又找到另外一个,要使用TYPE_APPLICATION_OVERLAY
类型。 试了还是不行,这是Manifest的代码;
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
怎么办;在程序信息里看到没有此类的权限,原来是另外的设置:
设置后,报另外一个错误:permission denied for window type 2038
然后是我的系统7.1,权限改为TYPE_PHONE可以,但是没实现悬浮的感觉,只是需要自定义View,下面是完整代码.
fun showDialog() { var dialog: AlertDialog.Builder = AlertDialog.Builder(this) var alear: AlertDialog = dialog.setIcon(R.drawable.ic_launcher_background).setTitle(R.string.app_name) .setMessage(R.string.msg).setPositiveButton(R.string.ok, object : DialogInterface.OnClickListener { override fun onClick(p0: DialogInterface?, p1: Int) { Log.e("kotlin", "button_click") } }).create() if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { alear.window.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) } else { alear.window.setType(WindowManager.LayoutParams.TYPE_PHONE) } alear.window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) alear.show() }