从棉花糖开始,Android系统引入了新的权限机制,即本文要讲的运行时权限。css
何为运行时权限呢?举个栗子,以某个须要拍照的应用为例,当运行时权限生效时,其Camera权限不是在安装后赋予,而是在应用运行的时候进行请求权限(好比当用户按下”相机拍照“按钮后)看到的效果则是这样的安全
接下来,对于Camera权限的处理彻底权交给用户。是否是有点像苹果系统的处理呢,不要说这是抄袭,暂且称为师夷长技以制夷。markdown
Android中有不少权限,但并不是全部的权限都是敏感权限,因而6.0系统就对权限进行了分类,通常为下述几类网络
正常权限具备以下的几个特色ide
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
SET_ALARM
INSTALL_SHORTCUT
UNINSTALL_SHORTCUT
上述的权限基本设计的是关于网络,蓝牙,时区,快捷方式等方面,只要在Manifest指定了这些权限,就会被授予,而且不能撤销。this
这里讲特殊权限提早讲一下,由于这个相对来讲简单一些。spa
特殊权限,顾名思义,就是一些特别敏感的权限,在Android系统中,主要由两个设计
关于上面两个特殊权限的受权,作法是使用startActivityForResult
启动受权界面来完成。code
private static final int REQUEST_CODE = 1;
private void requestAlertWindowPermission() {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
if (Settings.canDrawOverlays(this)) {
Log.i(LOGTAG, "onActivityResult granted");
}
}
}
上述代码须要注意的是orm
Settings.ACTION_MANAGE_OVERLAY_PERMISSION
启动隐式Intent"package:" + getPackageName()
携带App的包名信息Settings.canDrawOverlays
方法判断受权结果private static final int REQUEST_CODE_WRITE_SETTINGS = 2;
private void requestWriteSettings() {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE_WRITE_SETTINGS );
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_WRITE_SETTINGS) {
if (Settings.System.canWrite(this)) {
Log.i(LOGTAG, "onActivityResult write settings granted" );
}
}
}
上述代码须要注意的是
Settings.ACTION_MANAGE_WRITE_SETTINGS
启动隐式Intent"package:" + getPackageName()
携带App的包名信息Settings.System.canWrite
方法检测受权结果注意:关于这两个特殊权限,通常不建议应用申请。
危险权限实际上才是运行时权限主要处理的对象,这些权限可能引发隐私问题或者影响其余程序运行。Android中的危险权限能够归为如下几个分组:
各个权限分组与其具体的权限,能够参考下图:
PS:开发者最好把是否受权那个提示框的再也不显示去掉,也就是说重写那个是否受权的提示框,若是不那样作,会致使你的APP的界面静止不动,颇有可能会崩溃。
固然事情不是绝对的,你还能够告诉用户,他虽然点了再也不显示拒绝的,他还能够进入设置,赞成那个权限,若是用户再次在设置里边禁止那个权限,那么再次进入APP,系统仍是会提示是否受权的,也就是说
第一次打开APP-->拒绝权限,而且点了不在提示-->用户打开设置-->赞成该项权限-->用户在设置里边再次禁止权限-->打开APP-->系统仍是会提示是否受权