[置顶] Android6.0动态权限
2016-07-22 11:27
357 查看
起因:当时用的测试机是运行android6.0,并且代码中使用
然后发现在调用图库获取图片时,返回资源总是为null,也无法向SD卡存入照片,检查清单文件中是已经配置了读写外部内存权限的。
最后成功的解决方法是:在当前Activity中添加以下代码,代码的作用是检查是否已经获取到所需要的权限,如果没有则再次请求权限
原来是android6.0加强了对权限的管理,对于IDE使用API23及以上版本开发的APP运行在6.0及以上的系统时,敏感权限都需要在程序运行时进行动态获取,以上代码就是动态获取例子
请求权限的回调
普通权限:
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
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
需要动态申请的敏感权限分为多个权限组:CALENDAR、CAMERA、CONTACTS、LOCATION、MICROPHONE、PHONE、SENSORS、SMS、STORAGE,申请权限组中的任意一个通过后就会获得整个权限组的权限,具体展开为:
CALENDAR(日历)
READ_CALENDAR
WRITE_CALENDAR
CAMERA(相机)
CAMERA
CONTACTS(联系人)
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION(位置)
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONE(麦克风)
RECORD_AUDIO
PHONE(手机)
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORS(传感器)
BODY_SENSORS
SMS(短信)
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE(存储卡)
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
compileSdkVersion 23 buildToolsVersion '23.0.3'
然后发现在调用图库获取图片时,返回资源总是为null,也无法向SD卡存入照片,检查清单文件中是已经配置了读写外部内存权限的。
最后成功的解决方法是:在当前Activity中添加以下代码,代码的作用是检查是否已经获取到所需要的权限,如果没有则再次请求权限
// Check whether we have write permission int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions( this, PERMISSIONS_STORAGE,//需要请求的所有权限,这是个数组String[] REQUEST_EXTERNAL_STORAGE//请求码 ); }
原来是android6.0加强了对权限的管理,对于IDE使用API23及以上版本开发的APP运行在6.0及以上的系统时,敏感权限都需要在程序运行时进行动态获取,以上代码就是动态获取例子
请求权限的回调
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); }
普通权限:
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
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
需要动态申请的敏感权限分为多个权限组:CALENDAR、CAMERA、CONTACTS、LOCATION、MICROPHONE、PHONE、SENSORS、SMS、STORAGE,申请权限组中的任意一个通过后就会获得整个权限组的权限,具体展开为:
CALENDAR(日历)
READ_CALENDAR
WRITE_CALENDAR
CAMERA(相机)
CAMERA
CONTACTS(联系人)
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION(位置)
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONE(麦克风)
RECORD_AUDIO
PHONE(手机)
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORS(传感器)
BODY_SENSORS
SMS(短信)
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE(存储卡)
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
相关文章推荐
- android解析xml-用sax解析
- Android Support兼容包详解
- Android的5种数据存储方式概述
- Android应用内存泄露分析、改善经验总结
- Android中标签容器控件的实例详解
- Android--进度条--ProgressBar--SeekBar
- Android技术——进程的注入技术的应用
- android开发 使用Properties读取数据
- Android设计模式之---单例模式
- Android-transulcent-status-bar总结
- android通过Canvas和Paint截取无锯齿圆形图片
- Android富文本编辑器RichEditor的使用
- android studio无法预览
- android--startactivityforresult按back键重写onBackPressed()
- AndroidStudio 断点调试
- 关于调用Android系统分享
- Android动画--属性动画--基础
- Android内存泄漏的八种可能
- Android studio远程主机强迫关闭了一个现有的连接(夜神模拟器)
- Caused by: java.lang.ClassNotFoundException[android的终极解决错误]