不得不说的Android6.0新特性

*Android6.0简介:*

Android6.0称为Marshmallow(棉花糖),在2015年Google的I/O大会上正式发布,至今已经有一年多了,所占市场份额在2.3%以上,更新了比较多的模块,当然主要是对Android系统进行了优化,对于我们码农来说主要是应用权限的管理


*主要更新模块*

  • 电源管理
    在原有的电源管理的基础上加入了两种新的状态:

    1. App Standby—应用待机状态
      当系统检测到设备不充电,且用户没有直接或间接启动该应用时,该应用进入应用待机状态,而反之(当应用被激活或者设备在充电时)系统将该应用移出应用待机状态;
    2. Doze 系统休眠状态
      当系统检测到设备不充电,且设备静止灭屏一段时间会进入休眠状态,而如此周期性检测,状态不改变则会进入更长的休眠状态,一直到进入饱和休眠状态;
  • 规范化App Link (应用程序链接)
    *技术点:隐式Intent
    鼓励应用程序间关联,弱化浏览器的使用:比如说用户点击淘宝的广告,优先考虑跳转到淘宝APP(如果用户安装了淘宝APP),而不是浏览器广告。*

  • 指纹识别(统一API)
    6.0以前手机厂商自己研发(良莠不齐),6.0以后Android提供API,厂商只需要提供硬件支持即可。

  • 应用权限管理:运行时权限
    *5.0以前,只需要在manifest清单文件中注册声明即可;
    5.0以后,用户可以在安装时关闭某些权限;
    6.0及以后,对于一些隐私权限会在第一时间提示用户是否授权(类Iphone);*

运行时权限开发应用
Android6.0对权限进行了分类,分为:
1. Normal Premission:普通权限
2. Dangerous Permission/Group: 危险权限/组

        *危险权限分组:比如当用户授予应用读sdk权限,则该应用同时拥有写的权限,而不会再次询问用户*

新增API

  • ContextCompact.checkSelfPermission() 检测是否拥有权限
  • ActivityCompact.requestPermission() 申请授权
  • onRequestPermissionsResult() 用户是否授权
  • ActivityCompat.shouldShowRequestPermissionRationale() 权限解释(用户拒绝后出现)

使用流程:

  • 在manifest清单文件中添加权限(适配6.0以下)
  • 检查权限(危险)
  • 申请授权

危险权限查看:

  • 官网查看
  • 命令行查看:控制台输入下面命令即可查看危险权限组
adb shell pm list permissions -d -g
  • 1

下面是危险权限组:

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

下面是正常权限:

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_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS

代码实战:读写SD卡和拨打电话权限

  1. 首先在清单文件中添加:
<uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  • 1
  • 2
  • 3
  • 4

6.0以前,我们可以直接在点击事件里调用下面的代码实现拨打电话的功能:

startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+10086)));
  • 1

6.0以后这样写不行,程序会闪退,报一下错误,我们可以专门写一个方法来实现:

这里写图片描述

首先我们可以把拨打电话的代码进行封装

/**
     * 通过隐式Intent去拨打电话
     */
    private void doCallPhone() {
        startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+10086)));
    }


在AndroidStudio中doCallPhone()方法里面的代码会被划上红色波浪线,不要担心,这里并不影响编译和运行,只是提示你这里有危险权限需要检查是否授权。

然后需要检查是否授权,有授权就可以直接拨打电话,如果没有就需要申请授权。



    /**
     * 6.0后拨打电话
     */
    private void callPhone(){
        //当没有授权时
        if (ContextCompat.checkSelfPermission(this, 
                Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){
            //申请权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CALL_PHONE},1);
        }else {
            doCallPhone();
        }
    }

在申请授权时requestPermission()方法的第二个参数可以同时申请多个权限,第三个参数是请求码。
在没有授权的情况下只是申请授权是不够的,还需要监测申请授权是否成功,成功就可以直接调用拨打电话的doCallPhone()方法,不成功提示用户或者其他逻辑,下面我们来看代码:


/**
     * 处理申请授权是否成功
     * @param requestCode 请求码
     * @param permissions 权限数组
     * @param grantResults 授权结果数组
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
       switch (requestCode){
           case 1:
               //打电话权限回调
               if (grantResults[0]==PackageManager.PERMISSION_GRANTED){
                   doCallPhone();
               }else {
                   //提示用户权限未被授予
                   Log.d("MainActivity","未授予拨打电话权限");
               }
               break;

       }

    }

由于前面只有一个权限的申请,所以就只使用了grantResults[0],如果是多个权限可以使用foreach遍历,具体写法下面的封装中会提及;至此,一个拨打电话的授权就介绍了。如果大家觉得授权很麻烦,目前可以暂时修改app的buildgradle配置文件中targetSdkVersion为小于23即可,而编译版本可以不变,如下:

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"

    defaultConfig {
        applicationId "com.www.xxx"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
   ...
}


生活不易,全靠努力,谢谢支持了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值