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