Android MIUI通知類短信權(quán)限的坑
MIUI的坑爹設(shè)計(jì)還真不少。比如說(shuō),MIUI手機(jī)不插SIM卡就不能USB調(diào)試安裝應(yīng)用,好,插,結(jié)果又讓你先登錄小米賬號(hào)(無(wú)話可說(shuō))。MIUI權(quán)限申請(qǐng)也是坑!
就拿READ_SMS這個(gè)權(quán)限來(lái)說(shuō),按照安卓規(guī)范來(lái)動(dòng)態(tài)申請(qǐng),它不彈窗讓用戶允許,然后回調(diào)卻是成功的,到設(shè)置里一看,該權(quán)限還是詢問(wèn)狀態(tài)。這什么邏輯啊!
然后想實(shí)現(xiàn)自動(dòng)填短信驗(yàn)證碼,不好意識(shí),我MIUI自定義了一個(gè)通知類短信權(quán)限(Service_SMS),你不知道怎么申請(qǐng),也不知道怎么在manifest注冊(cè)。所以你沒(méi)有權(quán),也限監(jiān)聽不到的。我也不知道這個(gè)權(quán)限完整的名字叫什么,看設(shè)置里只有兩種狀態(tài)(沒(méi)有詢問(wèn),估計(jì)也沒(méi)法動(dòng)態(tài)申請(qǐng))。
目前有一種方案就是你引導(dǎo)用戶去開啟,但是現(xiàn)在短信都是通知條的形式,還會(huì)有個(gè)復(fù)制按鈕,這樣做其實(shí)多此一舉,但如果是其他敏感權(quán)限或許有這么做的價(jià)值。如下:
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)限沒(méi),其實(shí)也沒(méi)法判斷,只能“盲調(diào)”(自己創(chuàng)的一個(gè)詞)需要權(quán)限的代碼,所以需要try/catch一下,崩了就說(shuō)明沒(méi)有權(quán)限,沒(méi)問(wèn)題就說(shuō)明給了權(quán)限。
3、可以用sharePreference記錄下授權(quán)狀態(tài),不用每次都引導(dǎo)下(但這樣還是可能出現(xiàn)用戶給過(guò)權(quán)限后又手動(dòng)關(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);;
}
}
}
}
給個(gè)有用的ADB命令.可以獲取當(dāng)前Activity的信息,不然你以為,是怎么知道上面goPermissionSettings(Activity activity)方法里,跳轉(zhuǎn)到MIUI權(quán)限設(shè)置的Activity的包名和完整類名的:
adb shell dumpsys activity | findstr "mFocusedActivity"
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義控件實(shí)現(xiàn)短信驗(yàn)證碼自動(dòng)填充
- Android實(shí)現(xiàn)短信驗(yàn)證功能
- Android實(shí)現(xiàn)頁(yè)面短信驗(yàn)證功能
- Android8.1 通過(guò)黑名單屏蔽系統(tǒng)短信和來(lái)電功能
- Android實(shí)現(xiàn)自動(dòng)填充短信驗(yàn)證碼功能
- Android BroadcastReceiver接收收到短信的廣播
- Android 如何使用短信鏈接打開APP
- Android短信驗(yàn)證碼監(jiān)聽解決onChange多次調(diào)用的方法
- Android短信備份及數(shù)據(jù)插入實(shí)現(xiàn)代碼解析
相關(guān)文章
Android中自定義View實(shí)現(xiàn)圓環(huán)等待及相關(guān)的音量調(diào)節(jié)效果
這篇文章主要介紹了Android中自定義View實(shí)現(xiàn)圓環(huán)等待及相關(guān)的音量調(diào)節(jié)效果,邏輯非常簡(jiǎn)單,或許繪圖方面更加繁瑣XD 需要的朋友可以參考下2016-04-04
Android使用WebView實(shí)現(xiàn)離線閱讀功能
這篇文章主要介紹了Android使用WebView實(shí)現(xiàn)離線閱讀功能,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04
Android自定義view系列之99.99%實(shí)現(xiàn)QQ側(cè)滑刪除效果實(shí)例代碼詳解
這篇文章給大家介紹android自定義view系列之99.99%實(shí)現(xiàn)QQ側(cè)滑刪除效果,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧2016-09-09
Android Filterable實(shí)現(xiàn)Recyclerview篩選功能的示例代碼
這篇文章主要介紹了Android Filterable實(shí)現(xiàn)Recyclerview篩選功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
Android切換前后臺(tái)點(diǎn)擊通知進(jìn)入當(dāng)前頁(yè)面
這篇文章主要介紹了Android切換前后臺(tái)點(diǎn)擊通知進(jìn)入當(dāng)前頁(yè)面,主要講述當(dāng)App退出到后臺(tái)的后,怎么點(diǎn)擊通知回到原來(lái)按下HOME鍵之前的前臺(tái)頁(yè)面,需要的朋友可以參考下2023-03-03
Android自定義View軟鍵盤實(shí)現(xiàn)搜索
本文給大家分享android自定義view軟鍵盤實(shí)現(xiàn)搜索,對(duì)android軟鍵盤相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2015-12-12
Android WebView打開網(wǎng)頁(yè)一片空白的解決方法
這篇文章主要介紹了Android WebView打開網(wǎng)頁(yè)一片空白的解決方法,試了很多方法,最后記錄一下,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12

