MIUI应用权限设置
不管你认为我写的好坏都能够在以下评论告诉我,你的支持是我继续写下去的动力,谢谢。
随着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应用权限设置的更多相关文章
- Atitit godaddy 文件权限 root权限设置
Atitit godaddy 文件权限 root权限设置 1. ubuntu需要先登录,再su切换到root1 2. sudo 授权许可使用的su,也是受限制的su1 3. ubuntu默认吗roo ...
- Linux 权限设置chmod
Linux中设置权限,一般用chmod命令 1.介绍 权限设置chmod 功能:改变权限命令.常用参数: 1=x(执行权execute) 2=w(写权write) 4=r(读权Read) setuid ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- MAC OS X的ACL扩展权限设置
在WEB开发时,网站是以_www的用户运行的,而我在本地是以liuwencan的用户编辑的.这就带来一个问题:如果所有文件属于liuwencan,那么网站运行需要写文件时就因无权限而失败:如果所有文件 ...
- C#-WinForm-MDI窗体容器、权限设置
MDI窗体容器 - 放窗体的容器 窗体时顶级控件,是不允许放到其他的控件或窗体中的 (李献策lxc) 窗体属性中有一个属性:IsMdiContainer - 确定该窗体是否是MDI容器 在窗体中放一个 ...
- ACL权限设置命令setfacl和getfacl命令
ACL权限设置命令setfacl和getfacl命令 setfacl命令是用来在命令行里设置ACL(访问控制列表).在命令行里,一系列的命令跟随以一系列的文件名. [TOC] 选项 |参数|说明| ...
- MDI窗体容器、权限设置
一.MDI窗体容器: 1.功能: 它可以让其它窗体在它的内部打开,无法超出它的范围 将某个窗体的属性:IsMdiContainer设置为true - 窗口样式 2.问题: (1)如何将其它窗体在它的内 ...
- Linux 权限设置
一.文件和目录权限 在Linux系统中,用户可以对每一个文件或目录都具有访问权限,这些访问权限决定了谁能访问,以及如何访问这些文件和目录. 1.文件权限简介 在Linux系统中,每一位用户都有对文件或 ...
- QlikView 权限设置问题和注意
企业级报表通常都涉及到复杂的权限问题, 比如文本级权限和行级权限,某区域经理只能看到该区域的销售数据.QlikView自然也提供了该种功能. 具体方法: 在Edit script中新建一个tab, 输 ...
随机推荐
- jQuery判断一个元素是否为另一个元素的子元素(或者其本身)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head& ...
- luogu 2709小b的询问--莫队
https://www.luogu.org/problemnew/show/P2709 无修改的莫队几乎没有什么太高深的套路,比较模板吧,大多都是在那两个函数上动手脚. 这题询问每一种数字数量的平方和 ...
- [LOJ] 分块九题 6
单点插入,单点查询. 优化了的链表. 链表老写错,干脆用vector,也不算慢. 注意链表退化的问题,及时(比如操作根号n次)就重新建块,实测速度可以提高一倍,这还是数据随机的情况,若涉及大量同一位置 ...
- CAS机制(多线程)
---- 什么是CAS机制 CAS机制主要是发生于Java中原子操作类(JUC)的底层实现中,其中在CAS机制中包含3个基本参数:内存地址V.旧预期值A.要修改的新值B. 当要更新一个变量的时候,只有 ...
- 条款18:让接口容易被正确使用,不易被误用(Make interface easy to use correctly and hard to use incorrectly)
NOTE : 1.好的接口容易被正确使用,不容易被误用.应该让所有接口努力达成这些性质. 2.“促进正确使用”的办法包括接口的一致性,以及内置类型的行为兼容. 3.“阻止误用”的办法包括建立新类型/限 ...
- Flask---ajax(jquery)交互
目录结构如下: |--| |--run.py |--static |--test.txt |--templates |--index.html 前端代码如下: index.html <!DOCT ...
- ASP.NET MVC WebAPI请求
基础: 首先,先创建一个“ASP.NET 空Web应用程序” : 然后添加对 “System.Web.Http” 和 “System.Web.Http.WebHost” 的引用: 再添加对“Syste ...
- 『NYIST』第八届河南省ACM竞赛训练赛[正式赛一]CF-236B. Easy Number Challenge
B. Easy Number Challenge time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- HDU1213最简单的并查集问题
题目地址 http://acm.hdu.edu.cn/showproblem.php?pid=1213 #include<iostream> using namespace std; #d ...
- [luoguP2016] 战略游戏(DP)
传送门 f[i][0]表示不选当前节点,当前节点的所有儿子节点都选f[i][1]表示选当前节点,儿子节点可选可不选 #include <cstdio> #include <cstri ...