無論你覺得我寫的好壞都可以在下面評論告訴我,你的支持是我繼續(xù)寫下去的動力,謝謝!
隨著miui越來越封閉,小米對非自由渠道的應(yīng)用限制越來越苛刻,我們公司的產(chǎn)品一半以上的用戶都是來自小米,而且像我們這樣的靠短信支付維持收入的游戲,短信權(quán)限默認(rèn)禁止真是要了我們的命。被加入miui黑名單的游戲默認(rèn)重要的權(quán)限都是禁止?fàn)顟B(tài),譬如發(fā)送短信權(quán)限默認(rèn)設(shè)置為禁止就直接斷了我們收入來源。因此花了幾個小時在網(wǎng)上搜索相關(guān)資料,我們不能幫助用戶打開應(yīng)用的權(quán)限至少我們能夠引導(dǎo)用戶去打開應(yīng)用權(quán)限,并且將引導(dǎo)盡可能做的很簡單。
- 資料一:跳轉(zhuǎn)miui應(yīng)用權(quán)限設(shè)置頁面
(之兼容V5/V6老版本只跳轉(zhuǎn)上一級界面即可)
http://www.tuicool.com/articles/jUby6rA - 資料二:判斷當(dāng)前設(shè)備是否是小米
http://dev.xiaomi.com/doc/p=254/index.html - 資料三:完整demo下載地址
http://download.csdn.net/detail/tgbus18990140382/8932881
其他廢話也不多說了,直接上代碼
先是通過context跳轉(zhuǎn)到對應(yīng)應(yīng)用的權(quán)限設(shè)置頁面:
/**
* 跳轉(zhuǎn)到應(yīng)用權(quán)限設(shè)置頁面 http://www.tuicool.com/articles/jUby6rA
* @param context 傳入app 或者 activity context,通過context獲取應(yīng)用packegename,之后通過packegename跳轉(zhuǎn)制定應(yīng)用
* @return 是否是miui
*/
public static boolean gotoPermissionSettings(Context context) {
boolean mark = isMIUI();
if ( mark ) {
// 之兼容miui v5/v6 的應(yīng)用權(quán)限設(shè)置頁面,否則的話跳轉(zhuǎn)應(yīng)用設(shè)置頁面(權(quán)限設(shè)置上一級頁面)
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;
}
再就是判斷是否是小米的設(shè)備,官方為我們提供了一種簡單方便的辦法:
/**
* 檢查手機(jī)是否是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 {
/**
* 跳轉(zhuǎn)到應(yīng)用權(quán)限設(shè)置頁面 http://www.tuicool.com/articles/jUby6rA
* @param context 傳入app 或者 activity context,通過context獲取應(yīng)用packegename,之后通過packegename跳轉(zhuǎn)制定應(yīng)用
* @return 是否是miui
*/
public static boolean gotoPermissionSettings(Context context) {
boolean mark = isMIUI();
if ( mark ) {
// 之兼容miui v5/v6 的應(yīng)用權(quán)限設(shè)置頁面,否則的話跳轉(zhuǎn)應(yīng)用設(shè)置頁面(權(quán)限設(shè)置上一級頁面)
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;
}
/**
* 檢查手機(jī)是否是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;
}
}
以上函數(shù)的入口為:gotoPermissionSettings,傳入當(dāng)前application的context即可條狀到當(dāng)前應(yīng)用的權(quán)限設(shè)置頁面。