Andriod 权限
1、分类
首先安卓权限分为:正常权限、危险权限、特殊权限。
正常权限:
直接在AndriodManifest中配置即可以获得权限。例如:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
危险权限:
危险权限不仅需要需要在AndroidManifest中配置,还需要在使用前check是否真正拥有权限,以动态申请。
危险权限在6.0系统以上的手机中并不是不申请就一定没有权限,部分手机还是默认提供权限的。但是为了系统的兼容性,对于危险权限最好还是要先check。
危险权限有权限组的概念,即只要权限组中的任意一条获得了权限,该权限组就拥有了该权限。
编号 | 权限组 | 权限 | 中文 |
0 | CALENDAR | READ_CALENDAR WRITE_CALENDAR |
日历 |
1 | CAMERA | CAMERA | 相机 |
2 | CONTACTS | READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS |
联系人 |
3 | LOCATION | ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION |
位置 |
4 | MICROPHONE | RECORD_AUDIO | 麦克风 |
5 | PHONE | READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS |
电话 |
6 | SENSORS | BODY_SENSORS | 传感器 |
7 | SMS | SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS |
短信 |
8 | STORAGE | READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE |
存储 |
例如动态获取存储权限:
checkSelfPermisson(andriod.content.Context,String)主要用来判断我们是否拥有该权限,返回值:PERMISSON_GRANTED或者PERMISSON_DENIED
shouldShowRequestPermissionale(andriod.app.Activity,String[],int),官方的解释为:“Gets whether you should show UI with rationale for requesting a permission”,个人认为就是用户在没有点击同意或者拒绝时,它就会返回false,当用户点击了后,它就会返回true.
requestPermission(Activity activity , String[] permissions, int requestCode) ,用于来给用户判断是否开启权限,用户选择后,将会保存选择的结果,然后自动调用
ActivityCompat.OnRequestPermissionsResultCallback.onRequestPermissionsResult(int requestCode, String[] permission, int[] grantResults) 。
public void requestAllPower() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { /*ActivityCompat entends ContextCompat; * */ if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1); } } }
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { for (int i = 0; i < permissions.length; i++) { if (grantResults[i] == PERMISSION_GRANTED) { Toast.makeText(this, "" + "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "" + "权限" + permissions[i] + "申请失败", Toast.LENGTH_SHORT).show(); } } } }
特殊权限:
SYSTEM_ALERT_WINDOW : 设置悬浮窗
WRITE_SETTINGS : 修改系统设置
目前还没有亲手实现,可参照博文:
https://www.jianshu.com/p/c3908cb3554d