关于MIUI悬浮窗权限问题的解决方案
先扯会....好久没写Blog了....这段时间有点小忙...瞎忙.....忙的自己都感觉都不应该.....严重影响了生活质量......生活的幸福指数!!!.....到现在还特么的单身!!!求介绍啊......
MIUI是我个人非常喜欢的ROM....虽然有诸多的不爽....但是搞开发就能理解.....写好一个产品是多么的不易.....好多东西的不可控....精力的有限! 现在买手机都看能不能刷MIUI..不能刷的就犹豫了.....
===============盗链....盗内容的都是Erbility, Shability ========================
===============http://www.cnblogs.com/fangyucun/p/4027750.html=================
步入正题.....解决这个问题...无非就是2点
1.跳转
2.判断是否真的打开
......代码打开是别想了....要不然人家也不能弄着玩啊.....除非是你发现了什么....
跳转的思路很简单..手动找到那个界面..看看是哪个Activity.
public static ComponentName getTopComponentName(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);
ComponentName componentName = taskInfo.get(0).topActivity;
return componentName;
}
再通过ComponentName想知道什么不行啊.....不知道怎么执行....能想到这个问题...不应该吧....随便建议一下....跑个线程
下面就是跳转了....
/**
* 打开MIUI权限管理界面(MIUI v5, v6)
* @param context
*/
public static void openMiuiPermissionActivity(Context context) {
Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
String rom = RomUtils.getRom(); if (RomUtils.ROM_MIUI_V5.equals(rom)) {
PackageInfo pInfo = null;
try {
pInfo = context.getPackageManager().getPackageInfo(packageName, 0);
} catch (NameNotFoundException e) {
Flog.e(e);
}
intent.setClassName(SETTINGS_PACKAGE_NAME, "com.miui.securitycenter.permission.AppPermissionsEditor");
intent.putExtra("extra_package_uid", pInfo.applicationInfo.uid); } else if (RomUtils.ROM_MIUI_V6.equals(rom)) {
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
intent.putExtra("extra_pkgname", context.getPackageName());
} if (isIntentAvailable(context, intent)) {
if (context instanceof Activity) {
Activity a = (Activity) context;
a.startActivityForResult(intent, 2);
}
} else {
Flog.e("Intent is not available!");
}
}
很可惜....V5的悬浮窗权限在应用详情里面...
@TargetApi(9)
public static void openAppDetailActivity(Context context, String packageName) {
Intent intent = null;
if (Build.VERSION.SDK_INT >= 9) {
intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts(SCHEME_PACKAGE, packageName, null);
intent.setData(uri);
} else {
final String className = Build.VERSION.SDK_INT == 8 ?
SETTINGS_APPDETAILS_CLASS_NAME_22 : SETTINGS_APPDETAILS_CLASS_NAME_B21;
intent = new Intent(Intent.ACTION_VIEW);
intent.setClassName(SETTINGS_PACKAGE_NAME, SETTINGS_APPDETAILS_CLASS_NAME);
intent.putExtra(className, packageName);
}
if (isIntentAvailable(context, intent)) {
context.startActivity(intent);
} else {
Flog.e("intent is not available!");
}
}
另外加了个Intent的判断
/**
* 判断是否有可以接受的Activity
* @param context
* @param action
* @return
*/
public static boolean isIntentAvailable(Context context, Intent intent) {
if (intent == null) return false;
return context.getPackageManager().queryIntentActivities(intent, PackageManager.GET_ACTIVITIES).size() > 0;
}
v5, v6不知道怎么判断? 好吧...有点跑题了....
public static String getSystemProperty() {
String line = null;
BufferedReader reader = null;
try {
Process p = Runtime.getRuntime().exec("getprop ro.miui.ui.version.name" );
reader = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
line = reader.readLine();
return line;
} catch (IOException e) {
Flog.e(e);
} finally {
IoUtils.close(reader);
}
return "UNKNOWN";
}
根据返回的是V5还是V6判断
=====完成跳转.....下面就是判断了......自己是没琢磨出来....问的MIUI的工程师.....小帅哥太帅了.....感谢.....
/**
* 判断MIUI的悬浮窗权限
* @param context
* @return
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public static boolean isMiuiFloatWindowOpAllowed(Context context) {
final int version = Build.VERSION.SDK_INT; if (version >= 19) {
return checkOp(context, OP_SYSTEM_ALERT_WINDOW); //自己写就是24 为什么是24?看AppOpsManager
} else {
if ((context.getApplicationInfo().flags & 1<<27) == 1) {
return true;
} else {
return false;
}
}
}
@TargetApi(Build.VERSION_CODES.KITKAT)
public static boolean checkOp(Context context, int op) {
final int version = Build.VERSION.SDK_INT; if (version >= 19) {
AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
try {
if (AppOpsManager.MODE_ALLOWED == (Integer)ReflectUtils.invokeMethod(manager, "checkOp", op,
Binder.getCallingUid(), context.packageName())) { //这儿反射就自己写吧
return true;
} else {
return false;
}
} catch (Exception e) {
Flog.e(e.getMessage());
}
} else {
Flog.e("Below API 19 cannot invoke!");
}
return false;
}
到这儿就完事了...没想到牵扯的代码还挺多.......
关于MIUI悬浮窗权限问题的解决方案的更多相关文章
- Android 悬浮窗权限各机型各系统适配大全
这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时 ...
- Android 关于悬浮窗权限的问题
正常情况下的处理: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)以及在清单文件中添加 <use ...
- Android 悬浮窗权限校验
原文:Android 悬浮窗权限校验 悬浮窗权限: <uses-permission android:name="android.permission.SYSTEM_ALERT_WIN ...
- QT 安卓 悬浮窗权限动态申请
一:申请方式: String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.action.MANAGE_OVERLAY_PERMI ...
- Android浮窗权限研究(转载)
这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时 ...
- Android无需权限显示悬浮窗, 兼谈逆向分析app
前言 最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android. ...
- Android WindowManager悬浮窗:不需要申请权限实现悬浮
Android WindowManager悬浮窗:不需要申请权限实现悬浮 附录文章1介绍了Android平台上的悬浮窗WindowManager,WindowManager悬浮窗可以悬浮在And ...
- Android 高仿UC浏览器监控剪切板弹出悬浮窗功能
UC浏览器应该是android手机里 最流行的浏览器之一了,他们有一个功能 相信大家都体验过,就是如果你复制了什么文字,(在其他app中 复制也有这个效果!,所以能猜到肯定是监控了剪切板),就会弹出一 ...
- 详解如何实现斗鱼、B站等全局悬浮窗直播小窗口
最近业务需求需要我们直播返回或者退出直播间时,开一个小窗口在全局继续直播视频,先看效果图. 调研了一下当下主流直播平台,斗鱼.BiliBili等app,都是用WindowManger做的(这个你可以在 ...
随机推荐
- Linux环境上,Oracle常用命令
1.启动oracle数据库: //切换至Oracle用户: [root@server36 ~]# su - oracle //进入sqlplus环境,nolog参数表示不登录: [oracle@ser ...
- PowerDesigner Vs Enterprise Architect
注: 以下文中PD表示PowerDesigner,EA表示Enterprise Architect 最近一直在做设计方面的事情,之前一直在用PD.有个阿里过来的同事说阿里都是用EA,我就抽空小研究了一 ...
- C#汉字转换拼音技术详解
C#汉字转换拼音技术详解(高性能) 下面将源代码贴出.public static class ChineseToPinYin { private sta ...
- 对Spring的理解
1.Spring实现了工厂模式的工厂类,这个类名为BeanFactory实际上是一个接口,在程序中通常BeanFactory的子类ApplicationContext.Spring相当于一个大的工厂类 ...
- 百家搜索:在网站中添加Google、百度等搜索引擎
来源:http://www.ido321.com/1143.html 看到一些网站上添加了各种搜索引擎.如Google.百度.360.有道等,就有点好奇,这个怎么实现?研究了一各个搜索引擎怎么传送关键 ...
- [LeetCod] Single Number
Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...
- android string[] arraylist<string>互转
string[] to arraylist<string>:eg:string[] str; arraylist<string> arr; for(int i=0;i<s ...
- JAVA——利用wait和notify实现生产者和消费者
经典的消费者和生产者的的实现: 注意事项: 1:在循环里面用wait(),因为当线程获得了锁,但是有可能还没有满足其他条件: 2:公用的缓冲池要用锁机制: package demo; import j ...
- HDU4456-Crowd(坐标旋转+二位树状数组+离散化)
转自:http://blog.csdn.net/sdj222555/article/details/10828607 大意就是给出一个矩阵 初始每个位置上的值都为0 然后有两种操作 一种是更改某个位置 ...
- Delphi使用TStringHash实现建立类(有点像反射)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...