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

随着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跳转到相应应用的权限设置页面:

/**
* 跳转到应用权限设置页面 http://www.tuicool.com/articles/jUby6rA
* @param context 传入app 或者 activity context,通过context获取应用packegename,之后通过packegename跳转制定应用
* @return 是否是miui
*/
public static boolean gotoPermissionSettings(Context context) {
boolean mark = isMIUI(); if ( mark ) { // 之兼容miui v5/v6 的应用权限设置页面。否则的话跳转应用设置页面(权限设置上一级页面)
try {
Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");
localIntent.putExtra("extra_pkgname", context.getPackageName());
context.startActivity(localIntent);
} catch (ActivityNotFoundException e) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", context.getPackageName(),null);
intent.setData(uri);
context.startActivity(intent);
}
} return mark;
}

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

/**
* 检查手机是否是miui
* @ref http://dev.xiaomi.com/doc/p=254/index.html
* @return
*/
public static boolean isMIUI(){
String device = Build.MANUFACTURER;
System.out.println( "Build.MANUFACTURER = " + device );
if ( device.equals( "Xiaomi" ) ) {
System.out.println( "this is a xiaomi device" );
return true;
}
else{
return false;
}
}

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

/**
* 推断是否是miui V5/V6,老的miui无法兼容
* @param context
* @return
*/
public static boolean isMIUIv5v6(Context context) {
boolean result = false;
Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");
if (isIntentAvailable(context, localIntent)) {
result = true;
}
return result;
} /**
* 检查是否有这个activity
* @param context
* @param intent
* @return
*/
private static boolean isIntentAvailable(Context context, Intent intent) {
PackageManager packageManager = context.getPackageManager();
List<ResolveInfo> list = packageManager.queryIntentActivities(
intent, PackageManager.GET_ACTIVITIES);
return list.size() > 0;
}

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

public class SetMiuiPermission {

	/**
* 跳转到应用权限设置页面 http://www.tuicool.com/articles/jUby6rA
* @param context 传入app 或者 activity context。通过context获取应用packegename,之后通过packegename跳转制定应用
* @return 是否是miui
*/
public static boolean gotoPermissionSettings(Context context) {
boolean mark = isMIUI(); if ( mark ) { // 之兼容miui v5/v6 的应用权限设置页面,否则的话跳转应用设置页面(权限设置上一级页面)
try {
Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");
localIntent.putExtra("extra_pkgname", context.getPackageName());
context.startActivity(localIntent);
} catch (ActivityNotFoundException e) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", context.getPackageName(),null);
intent.setData(uri);
context.startActivity(intent);
}
} return mark;
} /**
* 检查手机是否是miui
* @ref http://dev.xiaomi.com/doc/p=254/index.html
* @return
*/
public static boolean isMIUI(){
String device = Build.MANUFACTURER;
System.out.println( "Build.MANUFACTURER = " + device );
if ( device.equals( "Xiaomi" ) ) {
System.out.println( "this is a xiaomi device" );
return true;
}
else{
return false;
}
} /**
* 推断是否是miui V5/V6,老的miui无法兼容
* @param context
* @return
*/
public static boolean isMIUIv5v6(Context context) {
boolean result = false;
Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");
if (isIntentAvailable(context, localIntent)) {
result = true;
}
return result;
} /**
* 检查是否有这个activity
* @param context
* @param intent
* @return
*/
private static boolean isIntentAvailable(Context context, Intent intent) {
PackageManager packageManager = context.getPackageManager();
List<ResolveInfo> list = packageManager.queryIntentActivities(
intent, PackageManager.GET_ACTIVITIES);
return list.size() > 0;
}
}

以上函数的入口为: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. 数的计数(noip2001,动态规划递推)

    题目链接: 普通版: https://www.luogu.org/problemnew/show/P1028 数据加强版: https://www.luogu.org/problemnew/show/ ...

  2. 21. SCHEMATA

    21. SCHEMATA 在MySQL中,SCHEMA是数据库,因此SCHEMATA表提供有关数据库的信息. SCHEMATA表有以下列: CATALOG_NAME :SCHEMA所属目录的名称.该值 ...

  3. pwnable.kr 之 passcode write up

    先看源码: #include <stdio.h> #include <stdlib.h> void login(){ int passcode1; int passcode2; ...

  4. keepalived安装脚本

    keepalived_install.sh: #cat keepalived_install.sh #!/bin/bash pkg=keepalived-2.0.10.tar.gz tar xf $p ...

  5. Druid连接池简单配置

    Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池.插件框架和SQL解析器组成.该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证.统计SQL ...

  6. Apache手册

    一.apache的安装 如果不指定安装位置,默认为/usr/local/apache2/

  7. notepad++编辑器写python需注意使用utf-8编码

    语言:python3.4 文本编辑器:notepad++ 报错:SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xb4 in ...

  8. python模块以及导入出现ImportError: No module named ‘xxx‘问题

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用如果你要使 ...

  9. HDU 5469 Antonidas

    Antonidas Time Limit: 4000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID:  ...

  10. 简单的发红包的PHP算法

    假设有有10元钱 ,发给10个人.保证每个人都有钱拿,最少分得0.01.我们最先想到的肯定就是随机.0.01-10随机.但是会出现第一个人就分得9.99的情况.下面就没人可分了.然后就是我的错误思路 ...