2015年8月18日早间消息,谷歌终于在M开头的众多甜品中为AndroidM确定了Marshmallow(棉花糖)这个正式名称,版本号也被确定为Android 6.0。
Android6.0相对于前面的版本更新的内容,只有权限管理是我们开发者需要去注意的。
之前的安卓应用都会索取一大堆的权限,也不知道它想干什么。现在用户权限管理机制已经大大改善了。现在的权限设置类似iPhone平台一样,只有在应用需要使用该功能的时候才会启用,而不是在首次安装应用的时候获得用户授权。
版本对比:
5.0-,只需要在manifest.xml中注册声明
5.0+,用户可以在安装的时候关闭某些权限
6.0+,对于一些用户隐私权限总是会第一次提示用户是否授予权限(和iphone类似)
作为开发者,最重要的是要知道这一改变会如何影响我们的项目。
Android6.0将权限进行了分类,分为普通权限和危险权限
普通权限:不涉及用户隐私,不需要用户进行授权,比如访问网络等;
危险权限:涉及用户隐私,需要用户进行授权,比如读取SD卡等;
可以通过adb命令去进行查看:
adb shell pm list permissions -d –g
所以在我们的代码中我们需要去对于6.0+的设备去主动申请危险权限。
操作步骤:
1、在AndroidManifest中添加需要的权限(不可省)
2、检查权限
3、申请授权
4、处理申请回调
权限的申请一般都是定义一个抽象类,当activity被创建的时候才去申请危险权限。
BaseActivity:
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/*
* 为子类提供权限检查方法
* */
public boolean hasPermission(String... permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission)
!= PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
/*
* 为子类提供一个权限请求方法
* */
public void requestPermission(int code,String... permissions){
ActivityCompat.requestPermissions(this,permissions,code);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode){
case Constants.WRITE_EXTERNAL_CODE:
doSDCardPermission();
break;
case Constants.CALL_PHONE:
doCallPhone();
break;
}
}
//默认的写SD卡权限处理,让子类去具体实现
public void doSDCardPermission() {
}
//默认的打电话权限处理,让子类去具体实现
public void doCallPhone(){
}
}
public class Constants {
//权限常量相关
public static final int WRITE_EXTERNAL_CODE = 0x01;
public static final int CALL_PHONE = 0x02;
}
除此之外还有一种方法去实现,是通过第三方开源库PermissionGen去实现,内部是通过反射去实现的。