Android6.0(Android M) 悬浮窗被禁用,无权限开启悬浮窗的解决方案

最近需要在Android6.0的机子上实现一个悬浮窗的功能,发现6.0之前的机子都能使用悬浮窗,但是唯独6.0版本不行,以下我是查到的相关资料,挺有意思的,顺带说一下:

国内查,所有的新闻统一都说是谷歌有意禁止该功能(默认关闭),且说不会妥协去修改,仅此而已,未找到相关的开发者解决方案。

国外查,尼玛人家说这个android6.0的bug,在6.0.1之后会修复。。。。

WTF,那么问题来了,本猿该信谁。。。。。。。。

Whatever,我要的是解决方案,直奔主题

——————————————————————————我是一条一本正经的分割线————————————————————————————

解决方案有两种:

一是如果你做的是系统应用开发,只要给apk签名,那么默认悬浮窗权限是给予的,显然这种情况不符合大多数开发者的要求。

二是在开启悬浮窗之前,引导用户去开启权限,本博文重点介绍这种方法

权限开启的UI路径是 “ 通用 -- 应用管理 -- 更多 -- 配置应用 --- 在其他应用的上层显示 --- 选择你的APP -- 运行在其他应用的上层显示 ”  >_< 藏得也是够深的!!!


【步骤1】在AndroidManifest.xml中添加悬浮窗的权限


【步骤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;
    //开启悬浮窗的Service
    Intent floatWinIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_floatwin);
        floatWinIntent = new Intent(TestFloatWinActivity.this, FloatWinService.class);
    }

    /**
     * 按下begin按钮
     *
     * @param v
     */
    public void begin(View v) {
        //开启悬浮框前先请求权限
        askForPermission();
    }

    /**
     * 按下end按钮
     *
     * @param v
     */
    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);
        }
    }

    /**
     * 用户返回
     *
     * @param requestCode
     * @param resultCode
     * @param data
     */
    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();
                //启动FxService
                startService(floatWinIntent);
            }

        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

大概解释一下,Activity中有两个Button,

一个Begin,对应方法是开启悬浮窗,但是在开启前回去检测权限,权限有则直接运行悬浮框,没有则直接跳转到权限请求页面,引导用户开启

一个End,对应的方法是关闭悬浮窗


悬浮窗的开启我是放在Service中的,Service开启悬浮窗运行,Serive停止悬浮窗关闭,这点大家可以根据自己的需求去改。

你可能感兴趣的:(Android,float,悬浮窗,悬浮框,permission,deny,android)