最近需要在Android6.0的机子上实现一个悬浮窗的功能,发现6.0之前的机子都能使用悬浮窗,但是唯独6.0版本不行,以下我是查到的相关资料,挺有意思的,顺带说一下:
国内查,所有的新闻统一都说是谷歌有意禁止该功能(默认关闭),且说不会妥协去修改,仅此而已,未找到相关的开发者解决方案。
国外查,尼玛人家说这个android6.0的bug,在6.0.1之后会修复。。。。
WTF,那么问题来了,本猿该信谁。。。。。。。。
Whatever,我要的是解决方案,直奔主题
——————————————————————————我是一条一本正经的分割线————————————————————————————
解决方案有两种:
一是如果你做的是系统应用开发,只要给apk签名,那么默认悬浮窗权限是给予的,显然这种情况不符合大多数开发者的要求。
二是在开启悬浮窗之前,引导用户去开启权限,本博文重点介绍这种方法
权限开启的UI路径是 “ 通用 -- 应用管理 -- 更多 -- 配置应用 --- 在其他应用的上层显示 --- 选择你的APP -- 运行在其他应用的上层显示 ” >_< 藏得也是够深的!!!
【步骤1】在AndroidManifest.xml中添加悬浮窗的权限
- <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
【步骤2】Activity的编写如下
- package test.floatWin;
-
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.Settings;
- import android.support.v7.app.AppCompatActivity;
- import android.view.View;
- import android.widget.Toast;
-
- import com.cxq.selftestdemo.R;
-
- public class TestFloatWinActivity extends AppCompatActivity {
-
- private static final String TAG = "TestFloatWinActivity";
- public static int OVERLAY_PERMISSION_REQ_CODE = 1234;
-
- Intent floatWinIntent;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_test_floatwin);
- floatWinIntent = new Intent(TestFloatWinActivity.this, FloatWinService.class);
- }
-
-
-
-
-
-
- public void begin(View v) {
-
- askForPermission();
- }
-
-
-
-
-
-
- public void end(View v) {
-
- stopService(floatWinIntent);
- }
-
-
-
-
-
- public void askForPermission() {
- if (!Settings.canDrawOverlays(this)) {
- Toast.makeText(TestFloatWinActivity.this, "当前无权限,请授权!", Toast.LENGTH_SHORT).show();
- Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
- Uri.parse("package:" + getPackageName()));
- startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
- } else {
- startService(floatWinIntent);
- }
- }
-
-
-
-
-
-
-
-
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
- if (!Settings.canDrawOverlays(this)) {
- Toast.makeText(TestFloatWinActivity.this, "权限授予失败,无法开启悬浮窗", Toast.LENGTH_SHORT).show();
- } else {
- Toast.makeText(TestFloatWinActivity.this, "权限授予成功!", Toast.LENGTH_SHORT).show();
-
- startService(floatWinIntent);
- }
-
- }
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- }
- }
大概解释一下,Activity中有两个Button,
一个Begin,对应方法是开启悬浮窗,但是在开启前回去检测权限,权限有则直接运行悬浮框,没有则直接跳转到权限请求页面,引导用户开启
一个End,对应的方法是关闭悬浮窗
悬浮窗的开启我是放在Service中的,Service开启悬浮窗运行,Serive停止悬浮窗关闭,这点大家可以根据自己的需求去改。