android动态申请悬浮框权限,Android中代码动态判断是否开启悬浮窗权限和申请悬浮窗权限...
原因
在某些机型上居然后出现permission denied for window type 2038错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.lanmao.jpsg.android, PID: 27024
android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W @ff8b1a
-- permission denied for window type 2038
at android.view.ViewRootImpl.setView(ViewRootImpl.java:1090)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:381)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
at com.quicksdk.apiadapter.undefined.a.y.b(ToolBar.java:58)
at com.quicksdk.apiadapter.undefined.UserAdapter$6.onClick(UserAdapter.java:138)
at com.quicksdk.apiadapter.undefined.a.r$a$1.onClick(LoginDialog.java:88)
at android.view.View.performClick(View.java:7339)
at android.widget.TextView.performClick(TextView.java:14226)
at android.view.View.performClickInternal(View.java:7305)
at android.view.View.access$3200(View.java:846)
at android.view.View$PerformClick.run(View.java:27787)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7081)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) ```
Build.VERSION.SDK_INT
Build.VERSION.SDK_INT 软件app安装在哪个手机上,该手机的操作系统版本号 比如8.1对应的SDK_INT是27
The SDK version of the software currently running on this hardware device.
This value never changes while a device is booted, but it may increase when
the hardware manufacturer provides an OTA update.
Android API与Android版本对应关系
SDK_INT
解决方案
主要代码
private static final int FloatRequestCode = 1002;
public void onCreate() {
super.onCreate();
Activity context = getContext();
com.quicksdk.Sdk.getInstance().onCreate(context);
if(!checkFloatPermission(context)){
requestFloatPermission(context, FloatRequestCode);
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
final Activity context = getContext();
com.quicksdk.Sdk.getInstance().onActivityResult(context,
requestCode, resultCode, data);
if(requestCode == FloatRequestCode) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if(!checkFloatPermission(context)){
requestFloatPermission(context,FloatRequestCode);
}
}
},1000);
}
}
/***
* 检查悬浮窗开启权限
* @param context
* @return
*/
public boolean checkFloatPermission(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return true;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
try {
Class cls = Class.forName("android.content.Context");
Field declaredField = cls.getDeclaredField("APP_OPS_SERVICE");
declaredField.setAccessible(true);
Object obj = declaredField.get(cls);
if (!(obj instanceof String)) {
return false;
}
String str2 = (String) obj;
obj = cls.getMethod("getSystemService", String.class).invoke(context, str2);
cls = Class.forName("android.app.AppOpsManager");
Field declaredField2 = cls.getDeclaredField("MODE_ALLOWED");
declaredField2.setAccessible(true);
Method checkOp = cls.getMethod("checkOp", Integer.TYPE, Integer.TYPE, String.class);
int result = (Integer) checkOp.invoke(obj, 24, Binder.getCallingUid(), context.getPackageName());
return result == declaredField2.getInt(cls);
} catch (Exception e) {
return false;
}
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
if (appOpsMgr == null)
return false;
int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), context
.getPackageName());
return Settings.canDrawOverlays(context) || mode == AppOpsManager.MODE_ALLOWED || mode == AppOpsManager.MODE_IGNORED;
} else {
return Settings.canDrawOverlays(context);
}
}
}
/**
* 悬浮窗开启权限
* @param context
* @param requestCode
*/
public void requestFloatPermission(Activity context, int requestCode){
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + context.getPackageName()));
context.startActivityForResult(intent, requestCode);
}
参考
android动态申请悬浮框权限,Android中代码动态判断是否开启悬浮窗权限和申请悬浮窗权限...相关推荐
- Android自定义浮框,Android实现全局悬浮框
本文实例为大家分享了Android实现全局悬浮框的具体代码,供大家参考,具体内容如下 效果图: 代码实现: Androidmanifest.xml添加弹框权限 自定义悬浮窗类FloatWindow.j ...
- android固定悬浮框,Android实现全局悬浮框
本文实例为大家分享了Android实现全局悬浮框的具体代码,供大家参考,具体内容如下 效果图: 代码实现: Androidmanifest.xml添加弹框权限 自定义悬浮窗类FloatWindow.j ...
- android之桌面悬浮框
类似360 的那个小球,一直悬浮在手机桌面上,点击时跳转其他界面 APK:http://fir.im/uraq 先说一下这个APK,为什么要说呢,因为安装完看不见图标,然后你会发现什么都没有,先去应用 ...
- 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )
文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...
- vue实现鼠标放上去就有提示_Vue实现鼠标经过文字显示悬浮框效果的示例代码
需求 在所做的Vue项目中,需要在鼠标移动文字框的时候显示一些详细信息.最终实现的效果如下: 鼠标经过button的时候,可以在光标附近显示出一个悬浮框,显示框里面显示时间和值的信息,鼠标移出butt ...
- Android仿360悬浮框
转自 http://blog.csdn.net/dawanganban/article/details/9751305 注意:在有的手机上显示不出来悬浮框,应该是本应用的悬浮框显示被禁止了,在本 ...
- oracle 动态执行ddl语句,Oracle过程中执行动态SQL或DDL语句
如果你用的是 Oracle 8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句, 如果你用的是 Oracle ...
- android动态申请悬浮框权限,Android创建悬浮窗的完整步骤
在Android中想要创建悬浮窗分为三步 1.申请权限 2.使用服务启动悬浮窗 3.设置悬浮窗参数并添加进WindowManager 下面话不多说了,来一起看看详细的实现过程 申请权限 首先需要申请悬 ...
- android动态申请悬浮框权限,Android动态权限申请工具(包括悬浮窗)
为了保证APP正常运行,动态权限申请是android比较常用的功能,由于每次都需要做申请.等待返回还有拒绝反馈等操作,比较麻烦,所以集成了一个比较简单的动态权限申请库 集成方法: Step 1. Ad ...
最新文章
- ItemAdding实现数据验证--中文字段,properties.AfterProperties值为null的问题
- 第十六届全国大学生智能汽车竞赛 讯飞智慧餐厅组别 全国选拔赛成绩公布说明
- python算不算编程_Python 并不适合职场编程
- 你很烫吗?我很烫——关于栈区和静态存储区的思考
- vue前期知识点笔记
- 线上课堂:ernetes Operator开发范式 - TiDB
- Glide 这样用,更省内存!!! 1
- linux 下挂载光驱
- 数据之路 - Python爬虫 - BeautifulSoup库
- PL/SQL Developer图形化窗口创建数据库(表空间和用户)以及相关查询sql
- steam怎么看邮箱绑定的账号_【一问一答】账号篇丨账号密码忘记了怎么办?不方,看这里!...
- 第十六周助教心得体会
- Instruments Leak
- 我国高分系列卫星遥感影像介绍
- 微观经济学之供给与需求--第一章第二章
- CAS配置数据库,实现数据库用户认证
- Java语音SDK接口开发经验及具体开发实现
- python中tile的用法_Python numpy.tile函数方法的使用
- MTK-MT6735-camera新加模组调试总结
- Webgame是什么?
热门文章
- java(7): 抽象类和接口区别
- TP5 使用GD库将一个头像缩略并处理成圆形png
- 树莓派不完全手册——配置树莓派系统
- java-readLine()用法
- Youtube 上最赚钱的人,前三名我哭了两次
- UVa 10566 - Crossed Ladders
- 编译时出现的(error C2632: 'long' followed by 'long' is illegal )非法定义的问题
- LaTex使用技巧9:argmin / argmax下标写法
- html中怎么改标题,html怎么改网页标题
- 一个关于SPS PDSCH HARQ-ACK的专利