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
- Android权限适配方案(API 4+)
- Android权限适配方案(API 4+)
- Android 权限申请最佳适配方案——permissions4m
- Android 适配方案
- Android适配方案
- Android屏幕适配方案
- Android屏幕适配方案
- Android屏幕适配方案
- Android 屏幕适配方案
- Android 屏幕适配方案
- Android屏幕适配方案
- Android 屏幕适配方案
- Android 屏幕适配方案
- Android 屏幕适配方案
- Android 屏幕适配方案
- Android 屏幕适配方案
- Android 屏幕适配方案
- Android 屏幕适配方案
- C语言的存储类型
- libPhenom:Facebook开源的高性能C语言并发编程框架
- First Shot
- HDU 1576:A/B (乘法逆元)
- Linux下的目录及其操作命令(改变工作目录和显示目录内容的命令
- Android权限适配方案(API 4+)
- 算法-海量数据处理
- phpcms后台无法上传图片问题解决方案之一
- Rational AppScan 工作原理 .
- 文件系统---认识ext2文件系统
- HDU-1231-最大连续子序列(DP)
- Windows系统下VS2013+caffe的安装
- JS继承的实现方式
- 拷贝构造函数详解