看电影免费网站,网站建设网页设计,免费的h5制作软件app,国外网站建设模板郭霖大神的文章:http://mp.weixin.qq.com/s?__bizMzA5MzI3NjE2MAmid2650235949idx1sn0f7eded67f834d38b02f8872768cb68ascene0#wechat_redirect今天周二#xff0c;又该跟大家分享由我执笔的文章了。从之前我写的deep links、通知栏微技巧这两篇文章中MzA5MzI3NjE2MAmid2650235949idx1sn0f7eded67f834d38b02f8872768cb68ascene0#wechat_redirect今天周二又该跟大家分享由我执笔的文章了。从之前我写的deep links、通知栏微技巧这两篇文章中大家应该能明显体会出什么叫短小精炼但又很有技术价值的文章。后面我还会坚持分享这种类型的文章尽量让大家十分钟内就可以读完并且还能有所收获。在Android上创建系统悬浮窗并不是什么新鲜技术我的人生第一篇博客就是写的关于如何实现类似于360手机卫士悬浮窗的功能大家有兴趣的可以到 http://guolin.tech 去翻翻历史。不过如果你将项目的targetSdkVersion指定成23或者更高你会发现之前创建悬浮窗的方式在Android 6.0系统上是无法运行的。不信的话我们就来试试。首先建立一个非常非常简单的自定义Viewpublic class FloatView extends Button { public FloatView(Context context) {super(context);setBackgroundResource(R.drawable.logo);}
}然后在程序中调用如下代码就可以创建出系统悬浮窗了public void showFloatView() {WindowManager windowManager (WindowManager) getSystemService(WINDOW_SERVICE);FloatView floatView new FloatView(getApplicationContext());WindowManager.LayoutParams params new WindowManager.LayoutParams();params.type WindowManager.LayoutParams.TYPE_PHONE;params.format PixelFormat.RGBA_8888;params.gravity Gravity.LEFT | Gravity.TOP;params.flags WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;params.width 150;params.height 150;params.x 0;params.y 0;windowManager.addView(floatView, params);
}上面的代码简单易懂就不再进行解释了如果对这部分代码还不理解的朋友请去参考我的历史第一篇博文好好学习一下。最后还需要在AndroidManifest.xml中添加一个权限uses-permission android:nameandroid.permission.SYSTEM_ALERT_WINDOW /
没错就是这么简单现在这段代码就已经可以成功创建出一个系统悬浮窗了不过是在Android 6.0系统之前。如果我们在6.0系统中运行上述代码注意targetSdkVersion要指定顾23程序就会直接崩溃错误日志如下图所示咦报了个权限被拒绝的错误可是我们已经在AndroidManifest.xml中申请权限了并且SYSTEM_ALERT_WINDOW权限也不是危险权限并不需要进行运行时权限申请。那么为什么在6.0系统上就会崩溃呢我们来查看一下官方文档的描述吧Note: If the app targets API level 23 or higher, the app user must explicitly grant this permission to the app through a permission management screen. The app requests the users approval by sending an intent with action ACTION_MANAGE_OVERLAY_PERMISSION. The app can check whether it has this authorization by calling Settings.canDrawOverlays().能够熟练阅读各类英文文档也是一门非常重要的技能。上面的描述大概意思就是说如果我们的targetSdkVersion指定成了23或者更高在使用SYSTEM_ALERT_WINDOW权限时需要先调用Settings.canDrawOverlays()来判断一下是否允许创建悬浮窗如果允许的话就可以创建了不允许的话还要发送一个action值为ACTION_MANAGE_OVERLAY_PERMISSION的Intent来让用户同意创建悬浮窗。针对文档的描述我们需要将代码改成下面这个样子public void buttonClick(View view) {if (Build.VERSION.SDK_INT 23) {if (Settings.canDrawOverlays(context)) {showFloatView();} else {Intent intent new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);startActivity(intent);}} else {showFloatView();}
}首先最外层先判断当前的系统版本如果低于6.0的话那就直接创建悬浮窗就可以了。当系统是6.0或者更高的时候我们就使用刚才文档中描述的流程来进行逻辑实现现在运行一下代码效果如下图所示可以看到当第一次创建悬浮窗的时候会先跳转到一个系统设置界面在这里我们选择允许当前程序创建系统悬浮窗然后下一次再点击按钮时就能成功创建出系统悬浮窗了。转载于:https://www.cnblogs.com/muyuge/p/6152121.html