原因

在某些机型上居然后出现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中代码动态判断是否开启悬浮窗权限和申请悬浮窗权限...相关推荐

  1. Android自定义浮框,Android实现全局悬浮框

    本文实例为大家分享了Android实现全局悬浮框的具体代码,供大家参考,具体内容如下 效果图: 代码实现: Androidmanifest.xml添加弹框权限 自定义悬浮窗类FloatWindow.j ...

  2. android固定悬浮框,Android实现全局悬浮框

    本文实例为大家分享了Android实现全局悬浮框的具体代码,供大家参考,具体内容如下 效果图: 代码实现: Androidmanifest.xml添加弹框权限 自定义悬浮窗类FloatWindow.j ...

  3. android之桌面悬浮框

    类似360 的那个小球,一直悬浮在手机桌面上,点击时跳转其他界面 APK:http://fir.im/uraq 先说一下这个APK,为什么要说呢,因为安装完看不见图标,然后你会发现什么都没有,先去应用 ...

  4. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

  5. vue实现鼠标放上去就有提示_Vue实现鼠标经过文字显示悬浮框效果的示例代码

    需求 在所做的Vue项目中,需要在鼠标移动文字框的时候显示一些详细信息.最终实现的效果如下: 鼠标经过button的时候,可以在光标附近显示出一个悬浮框,显示框里面显示时间和值的信息,鼠标移出butt ...

  6. Android仿360悬浮框

    转自    http://blog.csdn.net/dawanganban/article/details/9751305 注意:在有的手机上显示不出来悬浮框,应该是本应用的悬浮框显示被禁止了,在本 ...

  7. oracle 动态执行ddl语句,Oracle过程中执行动态SQL或DDL语句

    如果你用的是 Oracle 8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句, 如果你用的是 Oracle ...

  8. android动态申请悬浮框权限,Android创建悬浮窗的完整步骤

    在Android中想要创建悬浮窗分为三步 1.申请权限 2.使用服务启动悬浮窗 3.设置悬浮窗参数并添加进WindowManager 下面话不多说了,来一起看看详细的实现过程 申请权限 首先需要申请悬 ...

  9. android动态申请悬浮框权限,Android动态权限申请工具(包括悬浮窗)

    为了保证APP正常运行,动态权限申请是android比较常用的功能,由于每次都需要做申请.等待返回还有拒绝反馈等操作,比较麻烦,所以集成了一个比较简单的动态权限申请库 集成方法: Step 1. Ad ...

最新文章

  1. ItemAdding实现数据验证--中文字段,properties.AfterProperties值为null的问题
  2. 第十六届全国大学生智能汽车竞赛 讯飞智慧餐厅组别 全国选拔赛成绩公布说明
  3. python算不算编程_Python 并不适合职场编程
  4. 你很烫吗?我很烫——关于栈区和静态存储区的思考
  5. vue前期知识点笔记
  6. 线上课堂:ernetes Operator开发范式 - TiDB
  7. Glide 这样用,更省内存!!! 1
  8. linux 下挂载光驱
  9. 数据之路 - Python爬虫 - BeautifulSoup库
  10. PL/SQL Developer图形化窗口创建数据库(表空间和用户)以及相关查询sql
  11. steam怎么看邮箱绑定的账号_【一问一答】账号篇丨账号密码忘记了怎么办?不方,看这里!...
  12. 第十六周助教心得体会
  13. Instruments Leak
  14. 我国高分系列卫星遥感影像介绍
  15. 微观经济学之供给与需求--第一章第二章
  16. CAS配置数据库,实现数据库用户认证
  17. Java语音SDK接口开发经验及具体开发实现
  18. python中tile的用法_Python numpy.tile函数方法的使用
  19. MTK-MT6735-camera新加模组调试总结
  20. Webgame是什么?

热门文章

  1. java(7): 抽象类和接口区别
  2. TP5 使用GD库将一个头像缩略并处理成圆形png
  3. 树莓派不完全手册——配置树莓派系统
  4. java-readLine()用法
  5. Youtube 上最赚钱的人,前三名我哭了两次
  6. UVa 10566 - Crossed Ladders
  7. 编译时出现的(error C2632: 'long' followed by 'long' is illegal )非法定义的问题
  8. LaTex使用技巧9:argmin / argmax下标写法
  9. html中怎么改标题,html怎么改网页标题
  10. 一个关于SPS PDSCH HARQ-ACK的专利