Android6.0权限检测与申请

      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去实现,内部是通过反射去实现的。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值