Android M新改变
来源:互联网 发布:http服务默认端口号 编辑:程序博客网 时间:2024/05/08 17:30
随着Android 6.0的发布,Android M在功能和特性上面有了一些新的变化,这些变化包括Runtime Permissions(运行时权限)、Doze and App Standby、Apache HTTP Client Removal、BoringSSL、Access to Hardware Identifier、Notifications、AudioManager Changes、Text Selection、Browser Bookmark Changes、Android Keystore Changes、Wi-Fi and Networking Changes、Camera Service Changes、Runtime、APK Validation、USB Connection、Android for Work Changes。下面分别介绍一下这些变化。
Runtime Permissions(运行时权限)
- 什么是运行时权限
在之前的Android版本中如果我们的APP需要权限,只需要在manifest文件中声明即可使用,用户在安装APP后可以随意使用。但是Android M对权限进行了加强处理,我们早manifest文件中声明之后,在使用到相关的功能时需要重新授权才能使用,当然并不是所有的权限都需要重新授权,这些需要重新授权的权限成为Runtime Permission. - 运行时权限存在哪些影响
运行时权限对于用户来说更加方便、更加透明可见,用户可以更加直观的管理自己的权限,更好的保护了用户的隐私。但是对于开发者来说那就是又要多加判断啦~~(>_<)~~ 哪些权限是运行时权限呢
Google将权限分为两类:一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录等。- Normal Permission
- ACCESS_LOCATION_EXTRA_COMMANDS允许应用程序访问额外的位置提供程序命令。
- ACCESS_NETWORK_STATE允许程序访问有关网络的信息。
- ACCESS_NOTIFICATION_POLICY为应用标记希望访问通知策略的权限。(Added in API level 23)
- ACCESS_WIFI_STATE允许应用程序访问Wi-Fi网络的信息。
- BLUETOOTH允许应用程序连接到已配对的蓝牙设备。
- BLUETOOTH_ADMIN允许应用程序发现和配对蓝牙设备。
- BROADCAST_STICKY允许应用程序使用粘性广播,这些广播数据由该系统被完成之后保持,以便客户端可以快速地检索数据,而不必等待下一个广播。
- CHANGE_NETWORK_STATE允许应用程序改变网络连接状态。
- CHANGE_WIFI_MULTICAST_STATE允许应用程序进入的Wi-Fi多播模式。(Added in API level 4)
- CHANGE_WIFI_STATE允许应用程序改变Wi-Fi连接状态
- DISABLE_KEYGUARD允许应用程序禁用键盘锁,如果它是不安全的。
- EXPAND_STATUS_BAR允许应用程序展开或折叠状态栏。
- GET_PACKAGE_SIZE 允许应用程序找出任何package占用的空间。
- INSTALL_SHORTCUT允许应用程序安装快捷方式。(Added in API level 19)
- INTERNET允许应用程序连接网络。
- KILL_BACKGROUND_PROCESSES允许应用程序杀死后台进程。(Added in API level 8)
- MODIFY_AUDIO_SETTINGS允许应用程序修改全局的音频设置。
- NFC允许应用程序通过NFC进行I / O操作。(Added in API level 9)
- READ_SYNC_SETTINGS允许应用程序读取同步设置。
- READ_SYNC_STATS允许应用程序读取同步状态。
- RECEIVE_BOOT_COMPLETED允许应用程序接收系统启动之后的广播。
- REORDER_TASKS允许应用程序修改任务的Z顺序(不明白是什东东o(╯□╰)o)
- REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
- REQUEST_INSTALL_PACKAGES
- SET_ALARM允许应用程序广播一个Intent设置为用户报警。(Added in API level 9)
- SET_TIME_ZONE允许应用程序设置系统时区。
- SET_WALLPAPER允许应用程序设置壁纸。
- SET_WALLPAPER_HINTS允许应用程序设置壁纸提示。
- TRANSMIT_IR允许使用该设备的红外线发射器,如果有的话。
- UNINSTALL_SHORTCUT允许应用程序卸载启动的快捷方式。
- USE_FINGERPRINT允许应用程序使用指纹硬件。(Added in API level 23)
- VIBRATE允许访问震动。
- WAKE_LOCK允许使用PowerManager WakeLocks让处理器进入休眠或屏幕变暗。
- WRITE_SYNC_SETTINGS允许应用程序写入同步设置。
Dangerous Permission
所有的危险权限均属于权限组,这些危险权限也就是运行时权限group:android.permission-group.CONTACTS
- permission:android.permission.WRITE_CONTACTS
- permission:android.permission.GET_ACCOUNTS
- permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
- permission:android.permission.READ_CALL_LOG
- permission:android.permission.READ_PHONE_STATE
- permission:android.permission.CALL_PHONE
- permission:android.permission.WRITE_CALL_LOG
- permission:android.permission.USE_SIP
- permission:android.permission.PROCESS_OUTGOING_CALLS
- permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
- permission:android.permission.READ_CALENDAR
- permission:android.permission.WRITE_CALENDAR
group:android.permission-group.CAMERA
- permission:android.permission.CAMERA
group:android.permission-group.SENSORS
- permission:android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
- permission:android.permission.ACCESS_FINE_LOCATION
- permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
- permission:android.permission.READ_EXTERNAL_STORAGE
- permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.MICROPHONE
- permission:android.permission.RECORD_AUDIO
group:android.permission-group.SMS
- permission:android.permission.READ_SMS
- permission:android.permission.RECEIVE_WAP_PUSH
- permission:android.permission.RECEIVE_MMS
- permission:android.permission.RECEIVE_SMS
- permission:android.permission.SEND_SMS
- permission:android.permission.READ_CELL_BROADCASTS
同一组的任何一个权限被授权了,其他权限也自动被授权。
- Normal Permission
运行时权限相关API
直接开始说步骤
1. 在manifest中添加所需要的权限,这一步和之前的权限声明并没有什么区别,如果试图去请求一个没有声明的权限,程序很有可能直接崩溃。
2. 检查权限,这里涉及到一个API,ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { //没有授权 }else{ // }
3. 申请授权,该方法是异步的,第一个参数是Context;第二个参数是需要申请的权限的字符串数组;第三个参数为requestCode,主要用于回调的时候检测。可以从方法名requestPermissions以及第二个参数看出,是支持一次性申请多个权限的,系统会通过对话框逐一询问用户是否授权。
“`
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
- 什么是运行时权限
4. 处理权限申请回调,对于权限的申请结果,首先验证requestCode定位到你的申请,然后验证grantResults对应于申请的结果,这里的数组对应于申请时的第二个权限字符串数组。如果你同时申请两个权限,那么grantResults的length就为2,分别记录你两个权限的申请结果。如果申请成功,就可以做你的事情了~ @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do. } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } } } 综上4个步骤,对于运行时的权限的处理已经说完了,不过呢,还有一个API也是很重要的,就是用户在上一次已经拒绝过你的这个权限申请。也就是说,用户已经拒绝一次了,你又弹个授权框,你需要给用户一个解释,为什么要授权,则使用该方法。 // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. }总结一下,将上面的几个步骤整合到一起就成了下面的这段代码:// Here, thisActivity is the current activityif (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. }}
- 其他改变会在以后继续更新,(づ ̄ 3 ̄)づ
- Android M新改变
- Android M新特性
- Android M新特性
- Android M 新特性
- Android M 新特性
- Android M 六大新特性
- TextInputLayout-Android M新控件
- Snackbar-Android M新控件
- TabLayout-Android M新控件
- Snackbar-Android M新控件
- Android M新权限开发
- NavigationDrawer和NavigationView-Android M新控件
- Android M新控件之AppBarLayout,CoordinatorLayout
- Floating Action Button-Android M新控件
- Android 6.0 M的新特性
- Android M新控件知识整理
- Android M新的运行权限
- Android 6.0(M)版本新特征
- 关于 google的guava公共库的测试demo
- Universal-Image-Loader 相关配置注释详解
- Objective C 和 Javascript 之间的互相调用
- 轮廓系数的应用:kmeans聚类理论篇K的选择(轮廓系数)
- msyql优化案例
- Android M新改变
- 护照阅读器 护照识别仪 护照扫描仪 护照阅读机 电子护照阅读一体机 电子护照识读仪
- Android三种播放视频的方式
- shareSDK注意事项
- mybatis.net 和 dapper.net 性能比较
- USACO6.1 动态规划_剪枝_01二叉树
- Java 代理之静态代理
- 最近的工作生活的心得感悟,给自己的表现打50分,不及格
- 使用CreateThread 时报错,函数调用缺少参数列表