Android权限适配方案(API 4+)

来源:互联网 发布:租赁网络平台 编辑:程序博客网 时间:2024/04/25 18:42

由于Android6.0 加入了权限判断,如果你的项目buildToolsVersion是23+的话而没有做权限适配,那么程序就会崩溃;本文介绍的是笔者的权限适配的方案

首先我用的工具是github上别人开源的工具我用Java重写的 那个项目是用kotlin写的,感谢hotchemi (为什么去重写呢,因为小米与与官方的权限判断有点不同,然后向hotchemi大神请求加上小米手机的特别判断,但是人家不同意啊,因为他是日本的没有小米手机无法测试什么的) 
地址:https://github.com/a1018875550/PermissionDispatcher 
这是个很好的权限适配工具,支持到API 4+;在大部分手机上管用,并且我加入了小米手机权限的判断但只在6.0以上的小米手机管用

在此说明一点这个工具必须在Android Studio 2.0+版本使用,以前的版本使用会报莫名的bug,使用很蛋疼

导入方法: 
在项目的buid.gradle文件里添加

<code class="hljs matlab has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">buildscript <span class="hljs-cell" style="box-sizing: border-box;">{  dependencies {    classpath <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'com.neenbedankt.gradle.plugins:android-apt:1.8'</span>  }</span>}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

然后在Module的build.gradle文件中添加依赖和属性配置

<code class="hljs matlab has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">apply plugin: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'android-apt'</span>dependencies <span class="hljs-cell" style="box-sizing: border-box;">{   compile <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'org.jokar:permissiondispatcher:latest.version'</span>  apt <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'org.jokar:permissiondispatcher-processor:latest.version'</span>}</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

这里的latest.version也可以写成具体的版本号,具体的版本号地址在这里查看

ok导入好了,要介绍这个工具怎么使用了, 
首先介绍这个工具有哪些东西

这里写图片描述

  • @RuntimePermissions 是必须的注册当前activity或fragment
  • @NeedsPermission 是必须要有的,在需要权限的方法上添加
  • @OnShowRationale 注释一个方法解释为什么需要这个(个)权限并提示用户判断是否允许
  • @OnPermissionDenied 当权限被拒绝时调用
  • @OnNeverAskAgain 当用户勾选了不再提示时调用

这就是这个权限工具的所有功能 
使用方法:

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-property" style="box-sizing: border-box;">@RuntimePermissions</span>public <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">MainActivity</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">AppCompatActivity</span> {</span>    <span class="hljs-property" style="box-sizing: border-box;">@NeedsPermission</span>(Manifest.permission.CAMERA)    <span class="hljs-reserved" style="box-sizing: border-box;">void</span> showCamera() {        getSupportFragmentManager().beginTransaction()                .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())                .addToBackStack(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"camera"</span>)                .commitAllowingStateLoss();    }    <span class="hljs-property" style="box-sizing: border-box;">@OnShowRationale</span>(Manifest.permission.CAMERA)    <span class="hljs-reserved" style="box-sizing: border-box;">void</span> showRationaleForCamera(PermissionRequest request) {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> AlertDialog.Builder(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>)            .setMessage(R.string.permission_camera_rationale)            .setPositiveButton<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(R.string.button_allow, (dialog, button) -> request.proceed())</span>            .<span class="hljs-title" style="box-sizing: border-box;">setNegativeButton</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(R.string.button_deny, (dialog, button) -> request.cancel())</span>            .<span class="hljs-title" style="box-sizing: border-box;">show</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>;    }    @<span class="hljs-title" style="box-sizing: border-box;">OnPermissionDenied</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(Manifest.permission.CAMERA)</span>    <span class="hljs-title" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">showDeniedForCamera</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span> {        <span class="hljs-title" style="box-sizing: border-box;">Toast</span>.<span class="hljs-title" style="box-sizing: border-box;">makeText</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>, R.string.permission_camera_denied, Toast.LENGTH_SHORT)</span>.<span class="hljs-title" style="box-sizing: border-box;">show</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>;    }    @<span class="hljs-title" style="box-sizing: border-box;">OnNeverAskAgain</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(Manifest.permission.CAMERA)</span>    <span class="hljs-title" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">showNeverAskForCamera</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span> {        <span class="hljs-title" style="box-sizing: border-box;">Toast</span>.<span class="hljs-title" style="box-sizing: border-box;">makeText</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>, R.string.permission_camera_neverask, Toast.LENGTH_SHORT)</span>.<span class="hljs-title" style="box-sizing: border-box;">show</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>;    }}</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li></ul>

在acttivty/fragment 上添加@RuntimePermissions然后在需要权限的方法上添加@NeedsPermission,其他的根据需求添加;后一定要先点击Rebuild project

等build好后在onRequestPermissionsResult方法添加

<code class="hljs java has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onRequestPermissionsResult</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> requestCode, String[] permissions, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>[] grantResults) {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span>.onRequestPermissionsResult(requestCode, permissions, grantResults);    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// NOTE: delegate the permission handling to generated method</span>    MainActivityPermissionsDispatcher.onRequestPermissionsResult(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>, requestCode, grantResults);}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

这里MainActivityPermissionsDispatcher 的命名规则是根据当前activity/fragent +”PermissionsDispatcher” ;所以在自己写的时候不要死板硬套写MainActivityPermissionsDispatcher

然后这就注册好了,下面是怎么调用那个权限方法

<code class="hljs css has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-at_rule" style="box-sizing: border-box;">@<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Override</span>protected void <span class="hljs-function" style="box-sizing: border-box; color: rgb(0, 102, 102);">onCreate(Bundle savedInstanceState)</span> </span>{    <span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">super</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.onCreate</span>(<span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">savedInstanceState</span>);    <span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">setContentView</span>(<span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">R</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.layout</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.activity_main</span>);    <span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">findViewById</span>(<span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">R</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.id</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.button_camera</span>)<span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.setOnClickListener</span>(<span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">v</span> <span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span>> <span class="hljs-rules" style="box-sizing: border-box;">{      <span class="hljs-rule" style="box-sizing: border-box;">// <span class="hljs-attribute" style="box-sizing: border-box;">NOTE</span>:<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 102, 102);"> delegate the permission handling to generated method      MainActivityPermissionsDispatcher.<span class="hljs-function" style="box-sizing: border-box;">showCameraWithCheck(this)</span></span></span>;    <span class="hljs-rule" style="box-sizing: border-box;">}</span></span>);    <span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">findViewById</span>(<span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">R</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.id</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.button_contacts</span>)<span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.setOnClickListener</span>(<span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">v</span> <span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span>> <span class="hljs-rules" style="box-sizing: border-box;">{      <span class="hljs-rule" style="box-sizing: border-box;">// <span class="hljs-attribute" style="box-sizing: border-box;">NOTE</span>:<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 102, 102);"> delegate the permission handling to generated method      MainActivityPermissionsDispatcher.<span class="hljs-function" style="box-sizing: border-box;">showContactsWithCheck(this)</span></span></span>;    <span class="hljs-rule" style="box-sizing: border-box;">}</span></span>);}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>

如上所说当前activity/fragment +"PermissionsDispatcher".你注册的方法名

就这么简单完成了权限适配; 
然后再介绍一个配合这个工具使用的AS插件,让这个工具使用起来非常方便 插件名字叫做”PermissionsDispatcher plugin” 
使用方法: 
在activity/fragment页面 
alert+insert(windows) 
command + n (mac) 
运行效果如下: 
这里写图片描述

最后感谢此工具的原作者hotchemi

0 0
原创粉丝点击