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, 输 ...
随机推荐
- 树莓派搭建Seafile个人网盘
步骤一.安装Seafile依赖包 yum install python-setuptools python-ldap python-memcached MySQL-python mariadb mar ...
- phpize Cannot find autoconf. 错误解决
phpize Configuring for: PHP Api Version: 20151012 Zend Module Api No: 20151012 Zend Extension Api No ...
- Python中的函数(4)
一.传递列表 你经常会发现,向函数传递列表很有用,这种列表包含的可能是名字.数字或者更复杂的对象(如字典). 将列表传递给函数后,函数就能直接访问其内容. 栗子:假设有一个用户列表,我们要和其中每一位 ...
- SSM整合shiro
采用maven构建项目 1pom.xml中加入shiro依赖 <!-- shiro --> <dependency> <groupId>org.apache.shi ...
- pwnable.kr cmd2之write up
来看一下源代码: #include <stdio.h> #include <string.h> int filter(char* cmd){ ; r += strstr(cmd ...
- STM32F407 外部中断 个人笔记
IO口 STM32F4有上百个IO口中,每个都可以作为外部中断输入 中断线 STM32F4的中断控制器支持22个外部中断/事件请求(中断线) 对于每个中断线,我们可以设置相应的触发方式(上升沿触发,下 ...
- POJ-2773 Happy 2006,暴力2700ms+水过!
Happy 2006 这个题很可能会超时的,但我几乎暴力的方法2700ms+过了,可能是后台水 ...
- 【DFS+剪枝】Square
https://www.bnuoj.com/v3/contest_show.php?cid=9154#problem/J [题意] 给定n个木棍,问这些木棍能否围成一个正方形 [Accepted] # ...
- hdu 2845
#include<stdio.h> #define N 200100 int f[N]; int a[N],n; int main() { int m,j,i,suma,sumb,sum ...
- [USACO08OPEN]牛的车Cow Cars
题目描述 N (1 <= N <= 50,000) cows conveniently numbered 1..N are driving in separate cars along a ...