target-api 升级到26遇到的问题 国产ROM动态权限的坑

记录一下targetApi升级到23过程中遇到的一些问题

  1. 动态权限,使用TedPermission相关api即可处理;需要注意的是,在授予权限后立即跳转到其他界面有可能会出现黑屏情况,通过handler延迟跳转到其他界面就不会有问题了。
  2. 使用checkPermission注解时,最好不要把该注解放到系统的生命周期函数上,也不要放到例如onclickListener等方法上,避免影响系统的调用流程。该注解不适合放在有返回值的函数上面,否则当原有顺序执行操作被打断时,返回值不可预期。该注解只适合放在没有返回值的方法上,必要时抽取相关逻辑到一个无返回值的函数上。
  3. targetsdk为26时,如果使用getContentResolver().query(uri....)方法,且该uri的authority并没有与任何一个contentprovider绑定时,App会直接抛出异常,需要各位check自己的代码,使用contentResolver当作系统级别的观察者模式时,要有一个uri与之对应。
  4. sharedpreference中的MODE_WORLD_WRITEABLE模式在targetapi为26时,会直接返回空,如果需要使用进程之间共享数据,请使用contentprovider或者其他可靠的方案
  5. 涉及到暴漏文件uri给外部应用例如使用系统方式打开pdf文件场景,需要声明在manifest文件里面声明fileprovider,并在生成uri时,使用FileProvider的getUriForFile()生成uri,这里要求对应的intent添加flag:FLAG_GRANT_READ_URI_PERMISSION,这样子外部应用才能访问该文件。
  6. 安卓提供的检测权限是否授予的api,在国产机上无法做到百分百可靠,具体表现1:有的ROM(例如oppo,小米)会有一个询问的选项,当相关权限设置为询问时,是否获得权限的接口返回为true即获得权限,但是在实际调用相关敏感权限api时,会动态弹出一个对话框,除非用户点击相关选项或者等待对话框消失,这个api才会继续走下去返回相关值(对话框大概会持续3s左右,如果这个api在主线程调用,且执行这个api前后均执行了耗时操作,有可能出现ANR,没尝试过),即使用户拒绝了这个权限,也不会导致崩溃,整体行为与targetsdk设置在23以下时国产ROM的处理相同
  7. 国产ROM动态权限的坑:针对特定的权限例如oppo手机上的CALL_PHONE,即使在设置项关闭了相关权限,contextCompat依旧返回app有该权限,此时需要针对具体的权限做特殊处理,例如日历读权限,就要从日历里面读一个日历读的操作,看返回值是否符合预期,不符合预期,则表示对应的日历读权限没有获取。具体实现参考AndPermission

你可能感兴趣的:(target-api 升级到26遇到的问题 国产ROM动态权限的坑)