不管你认为我写的好坏都能够在以下评论告诉我,你的支持是我继续写下去的动力,谢谢。

随着miui越来越封闭,小米对非自由渠道的应用限制越来越苛刻。我们公司的产品一半以上的用户都是来自小米,并且像我们这种靠短信支付维持收入的游戏,短信权限默认禁止真是要了我们的命。被增加miui黑名单的游戏默认重要的权限都是禁止状态,譬如发送短信权限默认设置为禁止就直接断了我们收入来源。因此花了几个小时在网上搜索相关资料。我们不能帮助用户打开应用的权限至少我们可以引导用户去打开应用权限,并且将引导尽可能做的非常easy。

资料一:跳转miui应用权限设置页面(之兼容V5/V6老版本号仅仅跳转上一级界面就可以)http://www.tuicool.com/articles/jUby6rA

资料二:推断当前设备是否是小米 http://dev.xiaomi.com/doc/p=254/index.html

资料三:完整demo下载地址 http://download.csdn.net/detail/tgbus18990140382/8932881

其它废话也不多说了。直接上代码

先是通过context跳转到相应应用的权限设置页面:

  1. /**
  2. * 跳转到应用权限设置页面 http://www.tuicool.com/articles/jUby6rA
  3. * @param context 传入app 或者 activity context,通过context获取应用packegename,之后通过packegename跳转制定应用
  4. * @return 是否是miui
  5. */
  6. public static boolean gotoPermissionSettings(Context context) {
  7. boolean mark = isMIUI();
  8.  
  9. if ( mark ) {
  10.  
  11. // 之兼容miui v5/v6 的应用权限设置页面。否则的话跳转应用设置页面(权限设置上一级页面)
  12. try {
  13. Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
  14. localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");
  15. localIntent.putExtra("extra_pkgname", context.getPackageName());
  16. context.startActivity(localIntent);
  17. } catch (ActivityNotFoundException e) {
  18. Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  19. Uri uri = Uri.fromParts("package", context.getPackageName(),null);
  20. intent.setData(uri);
  21. context.startActivity(intent);
  22. }
  23. }
  24.  
  25. return mark;
  26. }

再就是推断是否是小米的设备。官方为我们提供了一种简单方便的办法:

  1. /**
  2. * 检查手机是否是miui
  3. * @ref http://dev.xiaomi.com/doc/p=254/index.html
  4. * @return
  5. */
  6. public static boolean isMIUI(){
  7. String device = Build.MANUFACTURER;
  8. System.out.println( "Build.MANUFACTURER = " + device );
  9. if ( device.equals( "Xiaomi" ) ) {
  10. System.out.println( "this is a xiaomi device" );
  11. return true;
  12. }
  13. else{
  14. return false;
  15. }
  16. }

我们相同也能够使用类似查找activtiy的方式推断是否是miui,可是这样的方式相同存在兼容的问题。不是非常推荐。也附上代码供大家參考:

  1. /**
  2. * 推断是否是miui V5/V6,老的miui无法兼容
  3. * @param context
  4. * @return
  5. */
  6. public static boolean isMIUIv5v6(Context context) {
  7. boolean result = false;
  8. Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
  9. localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");
  10. if (isIntentAvailable(context, localIntent)) {
  11. result = true;
  12. }
  13. return result;
  14. }
  15.  
  16. /**
  17. * 检查是否有这个activity
  18. * @param context
  19. * @param intent
  20. * @return
  21. */
  22. private static boolean isIntentAvailable(Context context, Intent intent) {
  23. PackageManager packageManager = context.getPackageManager();
  24. List<ResolveInfo> list = packageManager.queryIntentActivities(
  25. intent, PackageManager.GET_ACTIVITIES);
  26. return list.size() > 0;
  27. }

下面是完整的代码,能够直接使用的类:

  1. public class SetMiuiPermission {
  2.  
  3. /**
  4. * 跳转到应用权限设置页面 http://www.tuicool.com/articles/jUby6rA
  5. * @param context 传入app 或者 activity context。通过context获取应用packegename,之后通过packegename跳转制定应用
  6. * @return 是否是miui
  7. */
  8. public static boolean gotoPermissionSettings(Context context) {
  9. boolean mark = isMIUI();
  10.  
  11. if ( mark ) {
  12.  
  13. // 之兼容miui v5/v6 的应用权限设置页面,否则的话跳转应用设置页面(权限设置上一级页面)
  14. try {
  15. Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
  16. localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");
  17. localIntent.putExtra("extra_pkgname", context.getPackageName());
  18. context.startActivity(localIntent);
  19. } catch (ActivityNotFoundException e) {
  20. Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  21. Uri uri = Uri.fromParts("package", context.getPackageName(),null);
  22. intent.setData(uri);
  23. context.startActivity(intent);
  24. }
  25. }
  26.  
  27. return mark;
  28. }
  29.  
  30. /**
  31. * 检查手机是否是miui
  32. * @ref http://dev.xiaomi.com/doc/p=254/index.html
  33. * @return
  34. */
  35. public static boolean isMIUI(){
  36. String device = Build.MANUFACTURER;
  37. System.out.println( "Build.MANUFACTURER = " + device );
  38. if ( device.equals( "Xiaomi" ) ) {
  39. System.out.println( "this is a xiaomi device" );
  40. return true;
  41. }
  42. else{
  43. return false;
  44. }
  45. }
  46.  
  47. /**
  48. * 推断是否是miui V5/V6,老的miui无法兼容
  49. * @param context
  50. * @return
  51. */
  52. public static boolean isMIUIv5v6(Context context) {
  53. boolean result = false;
  54. Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
  55. localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");
  56. if (isIntentAvailable(context, localIntent)) {
  57. result = true;
  58. }
  59. return result;
  60. }
  61.  
  62. /**
  63. * 检查是否有这个activity
  64. * @param context
  65. * @param intent
  66. * @return
  67. */
  68. private static boolean isIntentAvailable(Context context, Intent intent) {
  69. PackageManager packageManager = context.getPackageManager();
  70. List<ResolveInfo> list = packageManager.queryIntentActivities(
  71. intent, PackageManager.GET_ACTIVITIES);
  72. return list.size() > 0;
  73. }
  74. }

以上函数的入口为:gotoPermissionSettings。传入当前application的context就可以条状到当前应用的权限设置页面。

MIUI应用权限设置的更多相关文章

  1. Atitit  godaddy 文件权限 root权限设置

    Atitit  godaddy 文件权限 root权限设置 1. ubuntu需要先登录,再su切换到root1 2. sudo 授权许可使用的su,也是受限制的su1 3. ubuntu默认吗roo ...

  2. Linux 权限设置chmod

    Linux中设置权限,一般用chmod命令 1.介绍 权限设置chmod 功能:改变权限命令.常用参数: 1=x(执行权execute) 2=w(写权write) 4=r(读权Read) setuid ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  4. MAC OS X的ACL扩展权限设置

    在WEB开发时,网站是以_www的用户运行的,而我在本地是以liuwencan的用户编辑的.这就带来一个问题:如果所有文件属于liuwencan,那么网站运行需要写文件时就因无权限而失败:如果所有文件 ...

  5. C#-WinForm-MDI窗体容器、权限设置

    MDI窗体容器 - 放窗体的容器 窗体时顶级控件,是不允许放到其他的控件或窗体中的 (李献策lxc) 窗体属性中有一个属性:IsMdiContainer - 确定该窗体是否是MDI容器 在窗体中放一个 ...

  6. ACL权限设置命令setfacl和getfacl命令

    ACL权限设置命令setfacl和getfacl命令 setfacl命令是用来在命令行里设置ACL(访问控制列表).在命令行里,一系列的命令跟随以一系列的文件名. [TOC] 选项 |参数|说明|   ...

  7. MDI窗体容器、权限设置

    一.MDI窗体容器: 1.功能: 它可以让其它窗体在它的内部打开,无法超出它的范围 将某个窗体的属性:IsMdiContainer设置为true - 窗口样式 2.问题: (1)如何将其它窗体在它的内 ...

  8. Linux 权限设置

    一.文件和目录权限 在Linux系统中,用户可以对每一个文件或目录都具有访问权限,这些访问权限决定了谁能访问,以及如何访问这些文件和目录. 1.文件权限简介 在Linux系统中,每一位用户都有对文件或 ...

  9. QlikView 权限设置问题和注意

    企业级报表通常都涉及到复杂的权限问题, 比如文本级权限和行级权限,某区域经理只能看到该区域的销售数据.QlikView自然也提供了该种功能. 具体方法: 在Edit script中新建一个tab, 输 ...

随机推荐

  1. java中的缓存技术该如何实现

    1缓存为什么要存在?2缓存可以存在于什么地方?3缓存有哪些属性?4缓存介质? 搞清楚这4个问题,那么我们就可以随意的通过应用的场景来判断使用何种缓存了. 1. 缓存为什么要存在?一 般情况下,一个网站 ...

  2. Ztree 多选,显示勾选的路径

    项目要求,需要向后台传递已经勾选的路径,如 l1-a, l1-l3-c,l1-l3-d;(如果是全选状态则只传递全选状态的路径,不传子节点). 具体可以参考jQ  Ztree 的 v3.5 版本 Me ...

  3. mysql 数据库 show命令

    MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法. 1. show tables或show tables fr ...

  4. 分分钟钟学会Python - 模块

    目录 模块 1 模块基础知识 2 random 返回随机生成的一个实数 3 hashlib 摘要算法模块 Hmac算法 4 time /datetime 时间模块 5 getpass 密码不显示(只能 ...

  5. Python面向对象之模块和包

    模块 模块的概念 模块是Python程序架构的一个核心概念 所有以.py结尾的源文件都是一个模块: 模块名也是标识符,需要遵循标识符的命名规则: 在模块中定义的全局变量,类,函数,都是直接给外界使用的 ...

  6. (二十一)python 3 内置函数

    阅读目录 1.abs() 2.dict() 3.help() 4.min() 5.setattr() 6.all() 7.dir() 8.hex() 9.next() 10.slice() 11.an ...

  7. POJ 1201 Intervals(差分约束 区间约束模版)

    关于差分约束详情可阅读:http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html 题意: 给定n个区间[L,R], 每个区间至 ...

  8. Jedis 工具类

    package com.pig4cloud.pigx.admin.utils; import redis.clients.jedis.*; import java.util.ArrayList; im ...

  9. Codeforces Round #269 (Div. 2)-D. MUH and Cube Walls,KMP裸模板拿走!

    D. MUH and Cube Walls 说实话,这题看懂题意后秒出思路,和顺波说了一下是KMP,后来过了一会确定了思路他开始写我中途接了个电话,回来kaungbin模板一板子上去直接A了. 题意: ...

  10. [HNOI2009]梦幻布丁(链表+启发式合并)

    洛谷传送门 开始一个O(n^2)思路,每次每句要改变颜色的点,改变完颜色后重新计算颜色的段数,显然拉闸. 然后呢..然后就不会了. 看了别人博客,才知道有个叫做启发式合并的东西,就是把小的合并到大的上 ...