您的位置:首页 > 移动开发 > Android开发

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

2016-04-22 14:03 579 查看
最近需要在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;
//开启悬浮窗的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停止悬浮窗关闭,这点大家可以根据自己的需求去改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: