Android 危险权限、权限组列表和所有普通权限

Android权限分为普通权限(Normal Permission)和危险权限(Dangerous Permission)。

一 . 介绍:
Normal Permission:在AndroidManifest.xml文件里配置好,App安装时就会默认获得这些权限,即使是在Android6.0系统的手机上,用户也无法在安装后动态取消这些normal权限。
Dangerous Permission:在AndroidManifest.xml文件里配置好,但是App安装时具体如果执行授权分以下几种情况:
    1. targetSdkVersion < 23 & API(手机系统) < 6.0 : 安装时默认获得权限,且用户无法在安装App之后取消权限。
    1. targetSdkVersion < 23 & API(手机系统) >= 6.0 : 安装时默认获得权限,但是用户可以在安装App完成后动态取消授权( 取消时手机会弹出提醒,告诉用户这个是为旧版手机打造的应用,让用户谨慎操作 )。
    1. targetSDKVersion >= 23 & API(手机系统) < 6.0 : 安装时默认获得权限,且用户无法在安装App之后取消权限。
    1. targetSDKVersion >= 23 & API(手机系统) >= 6.0 : 安装时不会获得权限,可以在运行时向用户申请权限。用户授权以后仍然可以在设置界面中取消授权,用户主动在设置界面取消后,在app运行过程中可能会出现crash。
二. 危险权限列表和所有权限列表:
  • 危险权限列表
编号权限组权限
1CALENDAR (日历)READ_CALENDAR
WRITE_CALENDAR
2CAMERA (相机)CAMERA
3CONTACTS (联系人)READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
4LOCATION (位置)ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
5MICROPHONE (麦克风)RECORD_AUDIO
6PHONE (手机)READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
7SENSORS (传感器)BODY_SENSORS
8SMS (短信)SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
9STORAGE (存储卡)READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
  • 所有权限列表
编号权限说明
1ACCESS_CHECKIN_PROPERTIES允许读写访问”properties”表在checkin数据库中,改值可以修改上传
2ACCESS_COARSE_LOCATION允许一个程序访问CellID或 WiFi热点来获取粗略的位置
3ACCESS_FINE_LOCATION允许一个程序访问CellID或 WiFi热点来获取粗略的位置
4ACCESS_LOCATION_EXTRA_COMMANDS允许应用程序访问额外的位置提供命令
5ACCESS_NETWORK_STATE允许程序获取网络信息状态,如当前的网络连接是否有效
6ACCESS_NOTIFICATION_POLICY希望访问通知策略的应用程序的标记许可
7ACCESS_WIFI_STATE允许程序获取当前WiFi接入的状态以及WLAN热点的信息
8ACCOUNT_MANAGER允许程序通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息
9ADD_VOICEMAIL允许一个应用程序添加语音邮件系统
10BATTERY_STATS允许程序更新手机电池统计信息
11BIND_ACCESSIBILITY_SERVICE请求accessibilityservice服务,以确保只有系统可以绑定到它
12BIND_APPWIDGET允许程序告诉appWidget服务需要访问小插件的数据库,只有非常少的应用才用到此权限
13BIND_CARRIER_MESSAGING_SERVICEAPI等级高于23时使用,否则使用BIND_CARRIER_SERVICES
14BIND_CARRIER_SERVICES允许绑定到运营商应用程序中的服务的系统进程将有这个权限
15BIND_CHOOSER_TARGET_SERVICE必须由ChooserTargetService要求,确保只有系统可以绑定到它
16BIND_DEVICE_ADMIN请求系统管理员接收者receiver,只有系统才能使用
17BIND_DREAM_SERVICE必须由一个DreamService要求,确保只有系统可以绑定到它
18BIND_INCALL_SERVICE必须由一个MidiDeviceService要求,确保只有系统可以绑定到它
19BIND_INPUT_METHOD请求InputMethodService服务,只有系统才能使用
20BIND_MIDI_DEVICE_SERVICE必须由一MidiDeviceService要求,确保只有系统可以绑定到它
21BIND_NFC_SERVICE由HostApduServiceOffHostApduService必须确保只有系统可以绑定到它
22BIND_NOTIFICATION_LISTENER_SERVICE必须要求由notificationlistenerservice,以确保只有系统可以绑定到它
23BIND_PRINT_SERVICE必须要求由printservice,以确保只有系统可以绑定到它
24BIND_REMOTEVIEWS必须通过RemoteViewsService服务来请求,只有系统才能用
25BIND_TELECOM_CONNECTION_SERVICE必须由ConnectionService要求,确保只有系统可以绑定到它
26BIND_TEXT_SERVICE必须要求textservice,以确保只有系统可以绑定到它
27BIND_TV_INPUT必须由TvInputService需要确保只有系统可以绑定到它
28BIND_VOICE_INTERACTION必须VoiceInteractionService要求,确保只有系统可以绑定到它
29BIND_VPN_SERVICE绑定VPN服务必须通过VpnService服务来请求,只有系统才能用
30BIND_WALLPAPER必须通过WallpaperService服务来请求,只有系统才能用
31BLUETOOTH允许程序连接配对过的蓝牙设备
32BLUETOOTH_ADMIN允许程序进行发现和配对新的蓝牙设备
33BLUETOOTH_PRIVILEGED允许应用程序配对蓝牙设备,而无需用户交互。这不是第三方应用程序可用
34BODY_SENSORS允许应用程序访问用户使用的传感器来测量他/她的身体内发生了什么,如心率仪
35BROADCAST_PACKAGE_REMOVED允许程序广播一个提示消息在一个应用程序包已经移除后
36BROADCAST_SMS允许程序当收到短信时触发一个广播
37BROADCAST_STICKY允许程序收到广播后快速收到下一个广播
38BROADCAST_WAP_PUSHWAP PUSH服务收到后触发一个广播
39CALL_PHONE允许程序从非系统拨号器里拨打电话
40CALL_PRIVILEGED允许程序拨打电话,替换系统的拨号器界面
41CAMERA允许程序访问摄像头进行拍照
42CAPTURE_AUDIO_OUTPUT允许一个应用程序捕获音频输出。不被第三方应用使用
43CAPTURE_SECURE_VIDEO_OUTPUT允许一个应用程序捕获视频输出。不被第三方应用使用
44CAPTURE_VIDEO_OUTPUT允许一个应用程序捕获视频输出,不被第三方应用使用
45CHANGE_COMPONENT_ENABLED_STATE改变组件是否启用状态
46CHANGE_CONFIGURATION允许当前应用改变配置,如定位
47CHANGE_NETWORK_STATE允许程序改变网络状态,如是否联网
48CHANGE_WIFI_MULTICAST_STATE允许程序改变WiFi多播状态
49CHANGE_WIFI_STATE允许程序改变WiFi状态
50CLEAR_APP_CACHE允许程序清除应用缓存
51CONTROL_LOCATION_UPDATES允许程序获得移动网络定位信息改变
52DELETE_CACHE_FILES允许程序删除缓存文件
53DELETE_PACKAGES允许程序删除应用
54DIAGNOSTIC允许程序到RW到诊断资源
55DISABLE_KEYGUARD允许程序禁用键盘锁
56DUMP允许程序获取系统dump信息从系统服务
57EXPAND_STATUS_BAR允许程序扩展或收缩状态栏
58FACTORY_TEST允许程序运行工厂测试模式
59FLASHLIGHT允许访问闪光灯
60GET_ACCOUNTS允许程序访问账户Gmail列表
61GET_ACCOUNTS_PRIVILEGED允许访问帐户服务中的帐户列表
62GET_PACKAGE_SIZE允许一个程序获取任何package占用空间容量
63GET_TASKS允许一个程序获取信息有关当前或最近运行的任务,一个缩略的任务状态,是否活动等等
64GLOBAL_SEARCH允许程序允许全局搜索
65INSTALL_LOCATION_PROVIDER允许程序安装定位提供
66INSTALL_PACKAGES允许程序安装应用
67INSTALL_SHORTCUT创建快捷方式
68INTERNET允许程序访问网络连接,可能产生GPRS流量
69KILL_BACKGROUND_PROCESSES允许程序调用killBackgroundProcesses(String).方法结束后台进程
70LOCATION_HARDWARE允许一个应用程序中使用定位功能的硬件,不使用第三方应用
71MANAGE_DOCUMENTS允许一个应用程序来管理文档的访问,通常是一个文档选择器部分
72MASTER_CLEAR允许程序执行软格式化,删除系统配置信息
73MEDIA_CONTENT_CONTROL允许一个应用程序知道什么是播放和控制其内容。不被第三方应用使用
74MODIFY_AUDIO_SETTINGS允许程序修改声音设置信息
75MODIFY_PHONE_STATE允许程序修改电话状态,如飞行模式,但不包含替换系统拨号器界面
76MOUNT_FORMAT_FILESYSTEMS允许程序格式化可移动文件系统,比如格式化清空SD卡
77MOUNT_UNMOUNT_FILESYSTEMS允许程序挂载、反挂载外部文件系统
78NFC允许程序执行NFC近距离通讯操作,用于移动支持
79PACKAGE_USAGE_STATS允许一个程序设置他的activities显示
80PERSISTENT_ACTIVITY允许程序创建一个永久的Activity,该功能标记为将来将被移除
81PROCESS_OUTGOING_CALLS允许程序监视,修改或放弃播出电话
82READ_CALENDAR允许程序读取用户的日程信息
83READ_CALL_LOG读取通话记录
84READ_CONTACTS允许程序访问联系人通讯录信息
85READ_EXTERNAL_STORAGE程序可以读取设备外部存储空间(内置SDcard和外置SDCard)的文件,如果您的App已经添加了”WRITE_EXTERNAL_STORAGE”权限,则就没必要添加读的权限了,写权限已经包含了读权限了
86READ_FRAME_BUFFER允许程序读取帧缓存用于屏幕截图
87READ_INPUT_STATE允许程序读取当前键的输入状态,仅用于系统
88READ_LOGS允许程序读取系统底层日志
89READ_PHONE_STATE允许程序访问电话状态
90READ_SMS允许程序读取短信内容
91READ_SYNC_SETTINGS允许程序读取同步设置,读取Google在线同步设置
92READ_SYNC_STATS允许程序读取同步状态,获得Google在线同步状态
93READ_VOICEMAIL允许应用程序在系统读取语音邮件
94REBOOT允许程序重新启动设备
95RECEIVE_BOOT_COMPLETED允许程序开机自动运行
96RECEIVE_MMS允许程序接收彩信
97RECEIVE_SMS允许程序接收短信
98RECEIVE_WAP_PUSH允许程序接收WAP PUSH信息
99RECORD_AUDIO允许程序录制声音通过手机或耳机的麦克
100REORDER_TASKS允许程序重新排序系统Z轴运行中的任务
101REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限的应用程序必须要使用ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS这是一个正常的权限:一个应用程序请求它将永远被授予权限,而不需要用户批准或看到它。
102REQUEST_INSTALL_PACKAGES允许应用程序请求安装包。针对API大于22必须持有该许可使用ACTION_INSTALL_PACKAGE应用。
103RESTART_PACKAGES允许程序结束任务通过restartPackage(String)方法,该方式将在外来放弃
104SEND_RESPOND_VIA_MESSAGE允许用户在来电的时候用你的应用进行即时的短信息回复
105SEND_SMS允许程序发送短信
106SET_ALARM允许程序设置闹铃提醒
107SET_ALWAYS_FINISH允许程序设置程序在后台是否总是退出
108SET_ANIMATION_SCALE允许程序设置全局动画缩放
109SET_DEBUG_APP允许程序设置调试程序,一般用于开发
110SET_PREFERRED_APPLICATIONS允许程序设置应用的参数,已不再工作具体查看addPackageToPreferred(String) 介绍
111SET_PROCESS_LIMIT允许程序设置最大的进程数量的限制
112SET_TIME允许程序设置系统时间
113SET_TIME_ZONE允许程序设置系统时区
114SET_WALLPAPER允许程序设置桌面壁纸
115SET_WALLPAPER_HINTS允许程序设置壁纸建议
116SIGNAL_PERSISTENT_PROCESSES允许程序发送一个永久的进程信号
117STATUS_BAR允许程序打开、关闭、禁用状态栏
118SYSTEM_ALERT_WINDOW允许程序显示系统窗口
119TRANSMIT_IR允许使用设备的红外发射器,如果可用
120UNINSTALL_SHORTCUT删除快捷方式
121UPDATE_DEVICE_STATS允许程序更新设备状态
122USE_FINGERPRINT允许应用程序使用指纹硬件
123USE_SIP允许程序使用SIP视频服务
124VIBRATE允许程序振动
125WAKE_LOCK允许程序在手机屏幕关闭后后台进程仍然运行
126WRITE_APN_SETTINGS允许程序写入网络GPRS接入点设置
127WRITE_CALENDAR允许程序写入日程,但不可读取
128WRITE_CALL_LOG允许程序写入(但是不能读)用户的联系人数据
129WRITE_CONTACTS写入联系人,但不可读取
130WRITE_EXTERNAL_STORAGE允许程序写入外部存储,如SD卡上写文件
131WRITE_GSERVICES允许程序修改Google服务地图
132WRITE_SECURE_SETTINGS允许应用程序读取或写入安全系统设置
133WRITE_SETTINGS允许程序读取或写入系统设置
134WRITE_SYNC_SETTINGS允许程序写入同步设置
135WRITE_VOICEMAIL允许应用程序修改和删除系统中的现有的语音邮件,只有系统才能使用
三. 权限动态申请:

单个权限和多个权限动态申请

1.配置AndroidManifest.xml文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xm.permission">

    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    ...
</manifest>
2.权限动态申请
public class MainActivity extends AppCompatActivity implements View.OnClickListener
{
    private static final int PERMISSIONS_REQUEST = 1;       // 单个权限申请
    private static final int PERMISSIONS_REQUEST_MORE = 2;  // 多个权限申请

    // 权限列表
    String[] permissions = new String[]{
            Manifest.permission.CAMERA,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.CALL_PHONE
        };
    // 声明一个集合,在后面的代码中用来存储用户拒绝授权的权
    List<String> mPermissionList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView()
    {
        // 单个权限申请按钮
        findViewById(R.id.btn1).setOnClickListener(this);
        // 多个个权限申请按钮
        findViewById(R.id.btn2).setOnClickListener(this);
    }

    @Override
    public void onClick(View v)
    {
        switch (v.getId())
        {
        case R.id.btn1:
            // 检查版本是否大于M
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            {
                if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED)
                {
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, PERMISSIONS_REQUEST);
                }
                else
                {
                    showToast("权限已申请");
                }
            }
            break;
        case R.id.btn2:
            mPermissionList.clear();
            for (int i = 0; i < permissions.length; i++)
            {
                if (ContextCompat.checkSelfPermission(MainActivity.this, permissions[i]) != PackageManager.PERMISSION_GRANTED)
                {
                    mPermissionList.add(permissions[i]);
                }
            }
            if (mPermissionList.isEmpty())
            {
                // 未授予的权限为空,表示都授予了
                Toast.makeText(MainActivity.this, "已经授权", Toast.LENGTH_LONG).show();
            }
            else
            {
                // 请求权限方法
                String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
                ActivityCompat.requestPermissions(MainActivity.this, permissions, PERMISSIONS_REQUEST_MORE);
            }
            break;
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
    {
        if (requestCode == PERMISSIONS_REQUEST)
        {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                showToast("权限已申请");
            }
            else
            {
                showToast("权限已拒绝");
            }
        }
        else
        {
            if (requestCode == PERMISSIONS_REQUEST_MORE)
            {
                for (int i = 0; i < grantResults.length; i++)
                {
                    if (grantResults[i] != PackageManager.PERMISSION_GRANTED)
                    {
                        // 判断是否勾选禁止后不再询问
                        boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permissions[i]);
                        if (showRequestPermission)
                        {
                            showToast("权限未申请");
                        }
                    }
                }
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    private void showToast(String string)
    {
        Toast.makeText(MainActivity.this, string, Toast.LENGTH_LONG).show();
    }
}
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值