权限区分
Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 好比以往的开发中,开发人员只须要将须要的权限在清单文件中配置便可,安装后用户能够在设置中的应用信息中看到:XX应用以获取**权限。用户点击能够选择给应用相应的权限。此前的应用权限用户能够选择容许、提醒和拒绝。在安装的时候用户是已经知道应用须要的权限的。可是这样存在一个问题,就是用户在安装的时候,应用须要的权限十分的多(有些开发者为了省事,会请求一些没必要要的权限或者请求所有的权限),这个时候用户在安装应用的时候也许并无发现某些侵犯本身隐私的权限请求,安装以后才发现本身的隐私数据被窃取。其实Android6.0 动态权限一方面是为了广大用户考虑,另外一方面实际上是Google为了不一些没必要要的官司。可是这样作可实在是苦了程序员了。不过还好,权限不是全部的都须要动态申请,下面就说一下Android6.0对权限的分割:
1、普通权限
这类的权限不须要动态申请,须要这个权限的时候仍是按照以往的作法,在清单文件中申请相应的权限便可,在安装的时候会展现给用户,用户赞成安装就获取相应的权限。写法举例以下:
清单文件中:css
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.deepai.paipai"> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> ........
下面是对权限的总结:
android.permission.EXPAND_STATUS_BAR 容许一个程序扩展收缩在状态栏,android开发网提示应该是一个相似Windows Mobile中的托盘程序
android.permission.FACTORY_TEST 做为一个工厂测试程序,运行在root用户
android.permission.FLASHLIGHT 访问闪光灯,android开发网提示HTC Dream不包含闪光灯
android.permission.FORCE_BACK 容许程序强行一个后退操做是否在顶层activities
android.permission.FOTA_UPDATE 暂时不了解这是作什么使用的,android开发网分析多是一个预留权限.
android.permission.GET_ACCOUNTS 访问一个账户列表在Accounts Service中
android.permission.GET_PACKAGE_SIZE 容许一个程序获取任何package占用空间容量
android.permission.GET_TASKS 容许一个程序获取信息有关当前或最近运行的任务,一个缩略的任务状态,是否活动等等
android.permission.HARDWARE_TEST 容许访问硬件
android.permission.INJECT_EVENTS 容许一个程序截获用户事件如按键、触摸、轨迹球等等到一个时间流,android开发网提醒算是hook技术吧
android.permission.INSTALL_PACKAGES 容许一个程序安装应用
android.permission.INTERNAL_SYSTEM_WINDOW 容许打开窗口使用系统用户界面
android.permission.ACCESS_CHECKIN_PROPERTIES 容许读写访问“properties”表在checkin数据库中,改值能够修改上传。
android.permission.ACCESS_COARSE_LOCATION 容许一个程序访问CellID或WiFi热点来获取粗略的位置
android.permission.ACCESS_FINE_LOCATION 容许一个程序访问精良位置(如GPS)
android.permission.WRITE_CONTACTS 容许程序写入但不读取用户联系人数据
android.permission.WRITE_GSERVICES 容许程序修改Google服务地图
android.permission.WRITE_OWNER_DATA 容许一个程序写入但不读取全部者数据
android.permission.WRITE_SETTINGS 容许程序读取或写入系统设置
android.permission.WRITE_SMS 容许程序写短信
android.permission.WRITE_SYNC_SETTINGS 容许程序写入同步设置
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 容许应用程序访问额外的位置提供命令
android.permission.ACCESS_MOCK_LOCATION 容许程序建立模拟位置提供用于测试
android.permission.ACCESS_NETWORK_STATE 容许程序访问有关GSM网络信息
android.permission.ACCESS_SURFACE_FLINGER 容许程序使用SurfaceFlinger底层特性
android.permission.ACCESS_WIFI_STATE 容许程序访问Wi-Fi网络状态信息
android.permission.ADD_SYSTEM_SERVICE 容许程序发布系统级服务
android.permission.BATTERY_STATS 容许程序更新手机电池统计信息
android.permission.BLUETOOTH 容许程序链接到已配对的蓝牙设备
android.permission.BLUETOOTH_ADMIN 容许程序发现和配对蓝牙设备
android.permission.BROADCAST_PACKAGE_REMOVED 容许程序广播一个提示消息在一个应用程序包已经移除后
android.permission.BROADCAST_STICKY 容许一个程序广播经常使用intents
android.permission.CALL_PHONE 容许一个程序初始化一个电话拨号不需经过拨号用户界面须要用户确认
android.permission.DELETE_CACHE_FILES 容许程序删除缓存文件
android.permission.DELETE_PACKAGES 容许一个程序删除包
android.permission.DEVICE_POWER 容许访问底层电源管理
android.permission.DIAGNOSTIC 容许程序RW诊断资源
android.permission.DISABLE_KEYGUARD 容许程序禁用键盘锁
android.permission.DUMP 容许程序返回状态抓取信息从系统服务
android.permission.CALL_PRIVILEGED 容许一个程序拨打任何号码,包含紧急号码无需经过拨号用户界面须要用户确认
android.permission.CAMERA 请求访问使用照相设备
android.permission.CHANGE_COMPONENT_ENABLED_STATE 容许一个程序是否改变一个组件或其余的启用或禁用
android.permission.CHANGE_CONFIGURATION 容许一个程序修改当前设置,如本地化
android.permission.CHANGE_NETWORK_STATE 容许程序改变网络链接状态
android.permission.CHANGE_WIFI_STATE 容许程序改变Wi-Fi链接状态
android.permission.CLEAR_APP_CACHE 容许一个程序清楚缓存从全部安装的程序在设备中
android.permission.CLEAR_APP_USER_DATA 容许一个程序清除用户设置
android.permission.CONTROL_LOCATION_UPDATES 容许启用禁止位置更新提示从无线模块
android.permission.REBOOT 请求可以从新启动设备
android.permission.RECEIVE_BOOT_COMPLETED 容许一个程序接收到ACTION_BOOT_COMPLETED 广播在系统完成启动
android.permission.RECEIVE_MMS 容许一个程序监控将收到MMS彩信,记录或处理
android.permission.RECEIVE_SMS 容许程序监控一个将收到短信息,记录或处理
android.permission.RECEIVE_WAP_PUSH 容许程序监控将收到WAP PUSH信息
android.permission.RECORD_AUDIO 容许程序录制音频
android.permission.REORDER_TASKS 容许程序改变Z轴排列任务
android.permission.RESTART_PACKAGES 容许程序从新启动其余程序
android.permission.SEND_SMS 容许程序发送SMS短信
android.permission.INTERNET 容许程序打开网络套接字
android.permission.MANAGE_APP_TOKENS 容许程序管理(建立、催后、 z-order默认向z轴推移)程序引用在窗口管理器中
android.permission.MASTER_CLEAR 目前尚未明确的解释,android开发网分析多是清除一切数据,相似硬格机
android.permission.MODIFY_AUDIO_SETTINGS 容许程序修改全局音频设置
android.permission.MODIFY_PHONE_STATE 容许修改话机状态,如电源,人机接口等
android.permission.MOUNT_UNMOUNT_FILESYSTEMS 容许挂载和反挂载文件系统可移动存储
android.permission.PERSISTENT_ACTIVITY 容许一个程序设置他的activities显示
android.permission.PROCESS_OUTGOING_CALLS 容许程序监视、修改有关播出电话
android.permission.READ_CALENDAR 容许程序读取用户日历数据
android.permission.READ_CONTACTS 容许程序读取用户联系人数据
android.permission.READ_FRAME_BUFFER 容许程序屏幕波或和更多常规的访问帧缓冲数据
android.permission.READ_INPUT_STATE 容许程序返回当前按键状态
android.permission.READ_LOGS 容许程序读取底层系统日志文件
android.permission.READ_OWNER_DATA 容许程序读取全部者数据
android.permission.READ_SMS 容许程序读取短信息
android.permission.READ_SYNC_SETTINGS 容许程序读取同步设置
android.permission.READ_SYNC_STATS 容许程序读取同步状态
android.permission.SET_ACTIVITY_WATCHER 容许程序监控或控制activities已经启动全局系统中
android.permission.SET_ALWAYS_FINISH 容许程序控制是否活动间接完成在处于后台时
android.permission.SET_ANIMATION_SCALE 修改全局信息比例
android.permission.SET_DEBUG_APP 配置一个程序用于调试
android.permission.SET_ORIENTATION 容许底层访问设置屏幕方向和实际旋转
android.permission.SET_PREFERRED_APPLICATIONS 容许一个程序修改列表参数PackageManager.addPackageToPreferred()和PackageManager.removePackageFromPreferred()方法
android.permission.SET_PROCESS_FOREGROUND 容许程序当前运行程序强行到前台
android.permission.SET_PROCESS_LIMIT 容许设置最大的运行进程数量
android.permission.SET_TIME_ZONE 容许程序设置时间区域
android.permission.SET_WALLPAPER 容许程序设置壁纸
android.permission.SET_WALLPAPER_HINTS 容许程序设置壁纸hits
android.permission.SIGNAL_PERSISTENT_PROCESSES 容许程序请求发送信号到全部显示的进程中
android.permission.STATUS_BAR 容许程序打开、关闭或禁用状态栏及图标Allows an application toopen, close, or disable the status bar and its icons.
android.permission.SUBSCRIBED_FEEDS_READ 容许一个程序访问订阅RSS Feed内容提供
android.permission.SUBSCRIBED_FEEDS_WRITE 系统暂时保留改设置,android开发网认为将来版本会加入该功能。
android.permission.SYSTEM_ALERT_WINDOW 容许一个程序打开窗口使用TYPE_SYSTEM_ALERT,显示在其余全部程序的顶层
android.permission.VIBRATE 容许访问振动设备
android.permission.WAKE_LOCK 容许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失
android.permission.WRITE_APN_SETTINGS 容许程序写入API设置
android.permission.WRITE_CALENDAR 容许一个程序写入但不读取用户日历数据java
能够看出Android中对资源以及服务的访问都很是严格,另外,在程序打包成APK的时候也须要对软件进行签名。react
定位相关权限android
获取精确位置 android.permission.ACCESS_FINE_LOCATION 经过GPS芯片接收卫星的定位信息,定位精度达10米之内 访问定位额外命令 android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 容许程序访问额外的定位提供者指令 获取模拟定位信息 android.permission.ACCESS_MOCK_LOCATION 获取模拟定位信息,通常用于帮助开发者调试应用 控制定位更新 android.permission.CONTROL_LOCATION_UPDATES 容许得到移动网络定位信息改变 安装定位提供 android.permission.INSTALL_LOCATION_PROVIDER 安装定位提供
网络状态nginx
访问网络 android.permission.INTERNET 访问网络链接,可能产生GPRS流量 获取网络状态 android.permission.ACCESS_NETWORK_STATE 获取网络信息状态,如当前的网络链接是否有效 获取WiFi状态 android.permission.ACCESS_WIFI_STATE 获取当前WiFi接入的状态以及WLAN热点的信息 改变网络状态 android.permission.CHANGE_NETWORK_STATE 改变网络状态如是否能联网 改变WiFi多播状态 android.permission.CHANGE_WIFI_MULTICAST_STATE 改变WiFi多播状态 改变WiFi状态 android.permission.CHANGE_WIFI_STATE 改变WiFi状态
帐户管理程序员
帐户管理 android.permission.ACCOUNT_MANAGER 获取帐户验证信息,主要为GMail帐户信息,只有系统级进程才能访问的权限 验证帐户 android.permission.AUTHENTICATE_ACCOUNTS 容许一个程序经过帐户验证方式访问帐户管理ACCOUNT_MANAGER相关信息 访问帐户Gmail列表 android.permission.GET_ACCOUNTS 访问GMail帐户列表 管理帐户 android.permission.MANAGE_ACCOUNTS 容许程序管理AccountManager中的帐户列表
底层操做相关权限数据库
访问Surface Flinger android.permission.ACCESS_SURFACE_FLINGER Android平台上底层的图形显示支持,通常用于游戏或照相机预览界面和底层模式的屏幕截图 变成砖头 android.permission.BRICK 可以禁用手机,很是危险,顾名思义就是让手机变成砖头 硬件测试 android.permission.HARDWARE_TEST 访问硬件辅助设备,用于硬件测试 底层访问权限 android.permission.CWJ_GROUP 容许CWJ帐户组访问底层信息
蓝牙 通话 拍照api
使用蓝牙 android.permission.BLUETOOTH 容许程序链接配对过的蓝牙设备 蓝牙管理 android.permission.BLUETOOTH_ADMIN 容许程序进行发现和配对新的蓝牙设备 拨打电话 android.permission.CALL_PHONE 容许程序从非系统拨号器里输入电话号码 通话权限 android.permission.CALL_PRIVILEGED 容许程序拨打电话,替换系统的拨号器界面 拍照权限 android.permission.CAMERA 容许访问摄像头进行拍照 使用闪光灯 android.permission.FLASHLIGHT 容许访问闪光灯
清理缓存 应用数据 应用操做缓存
应用删除时广播 android.permission.BROADCAST_PACKAGE_REMOVED 当一个应用在删除时触发一个广播 删除缓存文件 android.permission.DELETE_CACHE_FILES 容许应用删除缓存文件 删除应用 android.permission.DELETE_PACKAGES 容许程序删除应用 清除应用缓存 android.permission.CLEAR_APP_CACHE 清除应用缓存 清除用户数据 android.permission.CLEAR_APP_USER_DATA 清除应用的用户数据 结束后台进程 android.permission.KILL_BACKGROUND_PROCESSES 容许程序调用killBackgroundProcesses(String).方法结束后台进程 安装应用程序 android.permission.INSTALL_PACKAGES 容许程序安装应用 强制后退 android.permission.FORCE_BACK 容许程序强制使用back后退按键,不管Activity是否在顶层 改变配置 android.permission.CHANGE_CONFIGURATION 容许当前应用改变配置,如定位 应用诊断 android.permission.DIAGNOSTIC 容许程序到RW到诊断资源 手机优化大师扩展权限 android.permission.CELL_PHONE_MASTER_EX 手机优化大师扩展权限 获取应用大小 android.permission.GET_PACKAGE_SIZE 获取应用的文件大小 获取任务信息 android.permission.GET_TASKS 容许程序获取当前或最近运行的应用 容许全局搜索 android.permission.GLOBAL_SEARCH 容许程序使用全局搜索功能 注射事件 android.permission.INJECT_EVENTS 容许访问本程序的底层事件,获取按键、轨迹球的事件流 内部系统窗口 android.permission.INTERNAL_SYSTEM_WINDOW 容许程序打开内部窗口,不对第三方应用程序开放此权限
电量 状态栏 壁纸markdown
电量统计 android.permission.BATTERY_STATS 获取电池电量统计信息 电源管理 android.permission.DEVICE_POWER 容许访问底层电源管理 状态栏控制 android.permission.EXPAND_STATUS_BAR 容许程序扩展或收缩状态栏 绑定壁纸 android.permission.BIND_WALLPAPER 必须经过WallpaperService服务来请求,只有系统才能用
其余
绑定小插件 android.permission.BIND_APPWIDGET 容许一个程序告诉appWidget服务须要访问小插件的数据库,只有很是少的应用才用到此权限 绑定设备管理 android.permission.BIND_DEVICE_ADMIN 请求系统管理员接收者receiver,只有系统才能使用 绑定输入法 android.permission.BIND_INPUT_METHOD 请求InputMethodService服务,只有系统才能使用 绑定RemoteView android.permission.BIND_REMOTEVIEWS 必须经过RemoteViewsService服务来请求,只有系统才能用 收到短信时广播 android.permission.BROADCAST_SMS 当收到短信时触发一个广播 连续广播 android.permission.BROADCAST_STICKY 容许一个程序收到广播后快速收到下一个广播 WAP PUSH广播 android.permission.BROADCAST_WAP_PUSH WAPPUSH服务收到后触发一个广播 改变组件状态 android.permission.CHANGE_COMPONENT_ENABLED_STATE 改变组件是否启用状态 禁用键盘锁 android.permission.DISABLE_KEYGUARD 容许程序禁用键盘锁 转存系统信息 android.permission.DUMP 容许程序获取系统dump信息从系统服务 工厂测试模式 android.permission.FACTORY_TEST 容许程序运行工厂测试模式
ACCESS_LOCATION_EXTRA_COMMANDS 定位权限
ACCESS_NETWORK_STATE 网络状态权限
ACCESS_NOTIFICATION_POLICY 通知 APP通知显示在状态栏
ACCESS_WIFI_STATE WiFi状态权限
BLUETOOTH 使用蓝牙权限
BLUETOOTH_ADMIN 控制蓝牙开关
BROADCAST_STICKY 粘性广播
CHANGE_NETWORK_STATE 改变网络状态
CHANGE_WIFI_MULTICAST_STATE 改变WiFi多播状态,应该是控制手机热点(猜想)
CHANGE_WIFI_STATE 控制WiFi开关,改变WiFi状态
DISABLE_KEYGUARD 改变键盘为不可用
EXPAND_STATUS_BAR 扩展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 删除快捷方式
以上这些只是普通权限,咱们开发的时候,正常使用就好了,须要的权限在清单文件配置便可。
这类权限须要在须要的时候,须要咱们动态申请,好比:当咱们须要打开相机拍摄照片的时候须要咱们经过代码的方式在须要的地方去申请权限。Android6.0中权限问题中咱们须要注意的是:
1:因为权限API的问题,咱们的Actiivty最好是AppCompatActivity类型的,也就是说在你的BaseActivity须要继承AppCompatActivity
2:权限是分组的,同一组的权限申请其中一个,同组的权限就所有都申请了
特殊权限 组:
CALENDAR 日历 CAMERA 相机 CONTACTS 联系人 LOCATION 定位 MICROPHONE 麦克相关,好比录音 PHONE 手机状态 SENSORS 传感器 SMS 短信 STORAGE 存储权限
具体的权限分组状况以下表:
6.0的运行时权限,咱们最终都是要支持的,一般咱们须要使用以下的API
int checkSelfPermission(String permission) 用来检测应用是否已经具备权限,这个方法是在API23中才有的,为了兼容低版本,建议使用v4包中的ContextCompat.checkSelfPermission,在下面的注意事项中有解释,这里就不在赘述了
void requestPermissions(String[] permissions, int requestCode) 进行请求单个或多个权限,第一个参数是请求的权限集合,第二个参数是请求码,在回调监听中能够用来判断是哪一个权限请求的结果
void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 用户对请求做出响应后的回调,请求成功或者失败的监听
shouldShowRequestPermissionRationale这个API能够帮咱们判断接下来的对话框是否包含”再也不询问“选择框。在6.0以前的版本永远返回的是fasle
好比咱们请求CAMERA权限:
@Override public void onClick(View v) { // 一个按钮的点击事件 if (!(checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED)) { // 检查权限 if (shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) { // 6.0以前的手机返回的都是true(清单文件配置了的前提下) Toast.makeText(this, "Please grant the permission this time", Toast.LENGTH_LONG).show(); } requestReadContactsPermission(); } else { Log.i(LOGTAG, "onClick granted"); } } private static final int REQUEST_PERMISSION_CAMERA_CODE = 1; private void requestCameraPermission() { requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA_CODE); } /* * 结果回调 */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_PERMISSION_CAMERA_CODE) { int grantResult = grantResults[0]; boolean granted = grantResult == PackageManager.PERMISSION_GRANTED; // 请求权限的结果 true表明用户赞成了 Log.i(LOGTAG, "onRequestPermissionsResult granted=" + granted); } }
以上是Android提供给咱们的申请一个权限时的方式。若是咱们想同时申请多个权限就应该写为以下方式:
private static final int REQUEST_CODE = 1; private void requestMultiplePermissions() { String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE}; requestPermissions(permissions, REQUEST_CODE); }
上面的方式是Android提供给咱们的请求方式,这种方式的好处是彻底使用Android提供的api没有引入别的依赖,若是公司对应用安装包的大小比较在乎的话,建议使用原生的。
首先app的build.gradle添加依赖:
dependencies { compile 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar' compile 'io.reactivex:rxjava:1.1.6' }
而后就是使用
public void requestPermission(){ RxPermissions.getInstance(this) .request( Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE)//这里申请了两组权限 .subscribe(new Action1<Boolean>() { @Override public void call(Boolean granted) { if (granted) { //赞成 ... } else { //不一样意 Toast.makeText(LaunchActivity.this, "请赞成**的权限,才能继续提供服务", Toast.LENGTH_LONG).show(); } } }); }
因为checkSelfPermission和requestPermissions从API 23才加入,低于23版本,须要在运行时判断 或者使用Support Library v4中提供的方法
ContextCompat.checkSelfPermission
ActivityCompat.requestPermissions
ActivityCompat.shouldShowRequestPermissionRationale
当咱们支持了6.0必须也要支持4.4,5.0这些系统,因此须要在不少状况下,须要有两套处理。好比Camera权限
if (isMarshmallow()) { requestPermission();//而后在回调中处理 } else { useCamera();//低于6.0直接使用Camera }
特殊权限,顾名思义,就是一些特别敏感的权限,在Android系统中,主要由两个
SYSTEM_ALERT_WINDOW,设置悬浮窗,进行一些黑科技
WRITE_SETTINGS 修改系统设置
关于上面两个特殊权限的受权,作法是使用startActivityForResult启动受权界面来完成。
请求SYSTEM_ALERT_WINDOW
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"); } } }
上述代码须要注意的是
使用Action Settings.ACTION_MANAGE_OVERLAY_PERMISSION启动隐式Intent
使用”package:” + getPackageName()携带App的包名信息
使用Settings.canDrawOverlays方法判断受权结果
请求WRITE_SETTINGS
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" ); } } }
上述代码须要注意的是
使用Action Settings.ACTION_MANAGE_WRITE_SETTINGS 启动隐式Intent
使用”package:” + getPackageName()携带App的包名信息
使用Settings.System.canWrite方法检测受权结果
注意:关于上面这两个特殊权限,通常不建议应用申请。