Android MIUI通知类短信权限的坑

所属分类: 软件编程 / Android 阅读数: 93
收藏 0 赞 0 分享

MIUI的坑爹设计还真不少。比如说,MIUI手机不插SIM卡就不能USB调试安装应用,好,插,结果又让你先登录小米账号(无话可说)。MIUI权限申请也是坑!

就拿READ_SMS这个权限来说,按照安卓规范来动态申请,它不弹窗让用户允许,然后回调却是成功的,到设置里一看,该权限还是询问状态。这什么逻辑啊!
然后想实现自动填短信验证码,不好意识,我MIUI自定义了一个通知类短信权限(Service_SMS),你不知道怎么申请,也不知道怎么在manifest注册。所以你没有权,也限监听不到的。我也不知道这个权限完整的名字叫什么,看设置里只有两种状态(没有询问,估计也没法动态申请)。

目前有一种方案就是你引导用户去开启,但是现在短信都是通知条的形式,还会有个复制按钮,这样做其实多此一举,但如果是其他敏感权限或许有这么做的价值。如下:

1、首先判断系统是不是MIUI,然后在需要的Activity调用goPermissionSettings(Activity activity);

2、在相应activity重写onActivityResult,根据request_code,回调就直接执行需要用到权限的业务代码。但是用户到底给了权限没,其实也没法判断,只能“盲调”(自己创的一个词)需要权限的代码,所以需要try/catch一下,崩了就说明没有权限,没问题就说明给了权限。

3、可以用sharePreference记录下授权状态,不用每次都引导下(但这样还是可能出现用户给过权限后又手动关掉的情况)。上面的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样式和主题之选择器的实例讲解

今天小编就为大家分享一篇关于Android样式和主题之选择器的实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Android应用动态修改主题的方法示例

今天小编就为大家分享一篇关于Android应用动态修改主题的方法示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Flutter 网络请求框架封装详解

这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Flutter倒计时/计时器的实现代码

这篇文章主要介绍了Flutter倒计时/计时器的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android使用google breakpad捕获分析native cash

这篇文章主要介绍了Android使用google breakpad捕获分析native cash 的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Flutter WebView与JS互相调用简易指南

这篇文章主要介绍了详解Flutter WebView与JS互相调用简易指南,分为JS调用Flutter和Flutter调用JS,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android开发实现ListView和adapter配合显示图片和文字列表功能示例

这篇文章主要介绍了Android开发实现ListView和adapter配合显示图片和文字列表功能,涉及Android使用ListView结合adapter适配器实现图文显示功能相关的布局、解析、权限控制等操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Android文字基线Baseline算法的使用讲解

今天小编就为大家分享一篇关于Android文字基线Baseline算法的使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Flutter自定义实现神奇动效的卡片切换视图的示例代码

这篇文章主要介绍了Flutter自定义实现神奇动效的卡片切换视图的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android实现自定义滑动刻度尺方法示例

这篇文章主要给大家介绍了关于Android实现自定义滑动刻度尺的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享
查看更多