先扯会....好久没写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悬浮窗权限问题的解决方案的更多相关文章

  1. Android 悬浮窗权限各机型各系统适配大全

    这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时 ...

  2. Android 关于悬浮窗权限的问题

    正常情况下的处理: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)以及在清单文件中添加 <use ...

  3. Android 悬浮窗权限校验

    原文:Android 悬浮窗权限校验 悬浮窗权限: <uses-permission android:name="android.permission.SYSTEM_ALERT_WIN ...

  4. QT 安卓 悬浮窗权限动态申请

    一:申请方式: String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.action.MANAGE_OVERLAY_PERMI ...

  5. Android浮窗权限研究(转载)

    这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时 ...

  6. Android无需权限显示悬浮窗, 兼谈逆向分析app

    前言 最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android. ...

  7. Android WindowManager悬浮窗:不需要申请权限实现悬浮

     Android WindowManager悬浮窗:不需要申请权限实现悬浮 附录文章1介绍了Android平台上的悬浮窗WindowManager,WindowManager悬浮窗可以悬浮在And ...

  8. Android 高仿UC浏览器监控剪切板弹出悬浮窗功能

    UC浏览器应该是android手机里 最流行的浏览器之一了,他们有一个功能 相信大家都体验过,就是如果你复制了什么文字,(在其他app中 复制也有这个效果!,所以能猜到肯定是监控了剪切板),就会弹出一 ...

  9. 详解如何实现斗鱼、B站等全局悬浮窗直播小窗口

    最近业务需求需要我们直播返回或者退出直播间时,开一个小窗口在全局继续直播视频,先看效果图. 调研了一下当下主流直播平台,斗鱼.BiliBili等app,都是用WindowManger做的(这个你可以在 ...

随机推荐

  1. javascript AES加密 C#AES解密实现

    首先需要引入js类库 crypto-js(开源),地址:http://code.google.com/p/crypto-js 现在很多人无法打开这个地址不要紧,下面我们会将全部代码贴出来 需要引入 a ...

  2. C++程序设计之结构体,共用体,枚举和typedef

    [1]结构体的基本功 注意结构体里面可以有很多东西,可以结构体里面包含结构体 #include<iostream> using namespace std; struct Date { i ...

  3. 理解CSS盒子模型

    概述 网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin),CSS盒子模型都具备这些属性,也主要是这些属性. 这些属性我们可以把它转移到我 ...

  4. PHP实现分页:文本分页和数字分页

    来源:http://www.ido321.com/1086.html 最近,在项目中要用到分页.分页功能是经常使用的一个功能,所以,对其以函数形式进行了封装. // 分页分装 /** * $pageT ...

  5. mybatis系列-05-SqlMapConfig.xml详解

    mybatis的全局配置文件SqlMapConfig.xml,配置内容如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandler ...

  6. Windows Azure 不能ping通的解决方案

    Windows Azure 不能ping通如何解决? 为了避免Ping Flood攻击,Windows Azure不开放对外ICMP通讯协定,所以使用ping命令我们是无法ping通的.在微软资料中心 ...

  7. 一个谷粉和3年的Google Reader重度使用者的碎碎念

    2013-03-14 上午看到Andy Rubin辞去Android业务主管职务.由Chrome及应用高级副总裁继任的新闻,还在想这会给Android带来什么,中午刷微博的时候就挨了当头一棒:Goog ...

  8. MEAN stack 做网站【1】

    做一个小project,学习如何用MEAN技术栈来搭建网站. JavaScript新手,不足之处,请指出.(系统为win10) 搭建环境: 安装Node.JS (略过) 安装MySQL,MongoDB ...

  9. Web Service学习之二:Web Service(for JAVA)的几种框架

    在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS(也就是前面所述的JAX-WS,这是Java6发布所 ...

  10. java 字符串String操作工具类

    /** * StrKit. */ public class StrKit { /** * 首字母变小写 */ public static String firstCharToLowerCase(Str ...