国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android MIUI通知類短信權(quán)限的坑

2019-12-12 01:07:53
字體:
供稿:網(wǎng)友

MIUI的坑爹設(shè)計還真不少。比如說,MIUI手機不插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"

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 城市| 凤冈县| 阿巴嘎旗| 九龙县| 夏津县| 阿瓦提县| 徐州市| 溧阳市| 略阳县| 冕宁县| 穆棱市| 珠海市| 彰武县| 岳西县| 乡城县| 大同市| 黑河市| 汪清县| 子洲县| 乐山市| 贵州省| 安溪县| 阿荣旗| 晋中市| 保亭| 荔波县| 金川县| 平邑县| 河北省| 仙桃市| 张家口市| 六安市| 隆尧县| 双江| 连江县| 南丹县| 金堂县| 靖远县| 安平县| 松潘县| 宁津县|