溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-08-25 14:47:46 來(lái)源:億速云 閱讀:120 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

這篇文章給大家分享的是有關(guān)Android中MIUI通知類短信權(quán)限的坑有哪些的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

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)聽(tīng)不到的。我也不知道這個(gè)權(quán)限完整的名字叫什么,看設(shè)置里只有兩種狀態(tài)(沒(méi)有詢問(wèn),估計(jì)也沒(méi)法動(dòng)態(tài)申請(qǐng))。

目前有一種方案就是你引導(dǎo)用戶去開(kāi)啟,但是現(xiàn)在短信都是通知條的形式,還會(huì)有個(gè)復(fù)制按鈕,這樣做其實(shí)多此一舉,但如果是其他敏感權(quán)限或許有這么做的價(jià)值。如下:

1、首先判斷系統(tǒng)是不是MIUI,然后在需要的Activity調(diào)用goPermissionSettings(Activity activity);

2、在相應(yīng)activity重寫(xiě)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"

感謝各位的閱讀!關(guān)于“Android中MIUI通知類短信權(quán)限的坑有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI