Android M新改变

随着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

      同一组的任何一个权限被授权了,其他权限也自动被授权。

    • 运行时权限相关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 activity
if (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 ̄)づ
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值