MIUI的坑爹設(shè)計還真不少。比如說,MIUI手機(jī)不插SIM卡就不能USB調(diào)試安裝應(yīng)用笤休,好建峭,插,結(jié)果又讓你先登錄小米賬號(無話可說)启泣。MIUI權(quán)限申請也是坑涣脚!
就拿READ_SMS這個權(quán)限來說,按照安卓規(guī)范來動態(tài)申請寥茫,它不彈窗讓用戶允許遣蚀,然后回調(diào)卻是成功的,到設(shè)置里一看纱耻,該權(quán)限還是詢問狀態(tài)芭梯。這什么邏輯啊膝迎!
然后想實現(xiàn)自動填短信驗證碼粥帚,不好意識,我MIUI自定義了一個通知類短信權(quán)限(Service_SMS),你不知道怎么申請限次,也不知道怎么在manifest注冊芒涡。所以你沒有權(quán)限,也監(jiān)聽不到的卖漫。我也不知道這個權(quán)限完整的名字叫什么费尽,看設(shè)置里只有兩種狀態(tài)(沒有詢問,估計也沒法動態(tài)申請)羊始。
目前有一種方案就是你引導(dǎo)用戶去開啟旱幼,但是現(xiàn)在短信都是通知條的形式,還會有個復(fù)制按鈕突委,這樣做其實多此一舉柏卤,但如果是其他敏感權(quán)限或許有這么做的價值冬三。如下:
1、首先判斷系統(tǒng)是不是MIUI缘缚,然后在需要的Activity調(diào)用goPermissionSettings(Activity activity)勾笆;
2、在相應(yīng)activity重寫onActivityResult桥滨,根據(jù)request_code窝爪,回調(diào)就直接執(zhí)行需要用到權(quán)限的業(yè)務(wù)代碼。但是用戶到底給了權(quán)限沒齐媒,其實也沒法判斷蒲每,只能“盲調(diào)”(自己創(chuàng)的一個詞)需要權(quán)限的代碼,所以需要try/catch一下喻括,崩了就說明沒有權(quán)限邀杏,沒問題就說明給了權(quán)限。
3双妨、可以用sharePreference記錄下授權(quán)狀態(tài)淮阐,不用每次都引導(dǎo)下(但這樣還是可能出現(xiàn)用戶給過權(quán)限后又手動關(guān)掉的情況)。上面的try/catch很重要啊刁品,catch里可以做些處理,再引導(dǎo)一次或者你還有其他想法浩姥。
public class MiuiUtils {
private MiuiUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";
private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";
public static final int REQUEST_CODE_SERVICE_SMS = 100;
/**
* @return whether or not is MIUI
* @link http://dev.xiaomi.com/doc/p=254/index.html
*/
public static boolean isMIUI() {
String device = Build.MANUFACTURER;
LogUtils.v("Build.MANUFACTURER = " + device);
if (device.equals("Xiaomi")) {
Properties prop = new Properties();
try {
prop.load(new FileInputStream(new File(Environment
.getRootDirectory(), "build.prop")));
} catch (IOException e) {
e.printStackTrace();
return false;
}
return prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null
|| prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null
|| prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null;
} else {
return false;
}
}
public static void goPermissionSettings(Activity context) {
Intent intent;
try {//MIUI8/9
intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
intent.setClassName("com.miui.securitycenter",
"com.miui.permcenter.permissions.PermissionsEditorActivity");
intent.putExtra("extra_pkgname", context.getPackageName());
context.startActivityForResult(intent, REQUEST_CODE_SERVICE_SMS);
} catch (ActivityNotFoundException e) {
try {//MIUI5/6
intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
intent.setClassName("com.miui.securitycenter",
"com.miui.permcenter.permissions.AppPermissionsEditorActivity");
intent.putExtra("extra_pkgname", context.getPackageName());
context.startActivityForResult(intent, REQUEST_CODE_SERVICE_SMS);
} catch (ActivityNotFoundException e1) {
//應(yīng)用信息界面
intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", context.getPackageName(),
null);
intent.setData(uri);
context.startActivityForResult(intent, REQUEST_CODE_SERVICE_SMS);;
}
}
}
}
給個有用的ADB命令.可以獲取當(dāng)前Activity的信息挑随,不然你以為,是怎么知道上面goPermissionSettings(Activity activity)方法里勒叠,跳轉(zhuǎn)到MIUI權(quán)限設(shè)置的Activity的包名和完整類名的:
adb shell dumpsys activity | findstr "mFocusedActivity"