动态添加权限

请求单一权限

为了请求单一权限,我们可以使用checkSelfPermission()方法来检查应用是否已经授予了该权限。如下面代码所示,如果我们没有授予该权限,那么就需要使用requestPermissions()方法来请求,将要申请的权限以数组类型作为参数传入。


private static final int REQUEST_LOCATION = 1503;


private void requestSinglePermission() {
    String locationPermission = Manifest.permission.ACCESS_FINE_LOCATION;
    int hasPermission = checkSelfPermission(locationPermission);
    String[] permissions = new String[] { locationPermission };
    if (hasPermission != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(permissions, REQUEST_LOCATION);
    } else {
        // Phew - we already have permission!
    }
}


当调用requestPermissions()方法后,系统会弹出权限请求对话框。一旦用户对对话框做出回应,
onRequestPermissionsResult()方法就会被调用,在该方法内可以检查用户做出的授予或者拒绝操作


@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_LOCATION:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Handle permission granted
            } else {
                // Handle permission denied
            }
            break;
        default: 
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

在上面代码中,通过requestCode 检索到grantResults数组中的权限。如果此权限已被授予就可以使用该权限进行相应的操作。

另一方面,如果我们拒绝授予此权限,那么我们需要显示一些信息来告知用户无法继续操作。


请求多个权限

在多权限请求中,我们要做到事情和但权限请求稍有不同。在下面的例子中,我是先检查要申请的权限是否已经或者其中有已经被授予的情况,如果没有,我把没有授予的权限加到一个权限列表中。接着我将这个列表以参数的形式传递给requestPermissions()方法。


private void requestMultiplePermissions() {
    String locationPermission = Manifest.permission.ACCESS_FINE_LOCATION;
    String calendarPermission = Manifest.permission.WRITE_CALENDAR;
    int hasLocPermission = checkSelfPermission(locationPermission);
    int hasCalPermission = checkSelfPermission(calendarPermission);
    List
   
   
    
     permissions = new ArrayList
    
    
     
     ();
    if (hasLocPermission != PackageManager.PERMISSION_GRANTED) {
        permissions.add(locationPermission);
    }
    if (hasCalPermission != PackageManager.PERMISSION_GRANTED) {
        permissions.add(calendarPermission);
    }
    if (!permissions.isEmpty()) {
        String[] params = permissions.toArray(new String[permissions.size()]);
        requestPermissions(params, REQUEST_PERMISSIONS);
    } else {
        // We already have permission, so handle as normal
    }
}
    
    
   
   


在Android M上声明权限

对于只希望在Android-M设备使用该权限机制的应用,可以在Manifest文件中单独为Android M声明:

< uses-permission-sdk-m android:name = "android.permission.ACCESS_FINE_LOCATION" />

这种形式的定义在M版本以下和普通定义的权限一样而不是只在M版本的设备上会进行权限检查。所以当你使用该方法进行更新应用时不必担心版本兼容性问题。这样的权限只会在M版本的设备上可用在其他情况下是不会被请求的。


你真的需要权限吗?

记住在一些功能上可以是用Intent请求框架,而不需要请求权限亲自去调用操作。这样不用显示权限请求对话框可以大大提升用户体验。

  • ACTION_INSERT 只要满足需求该action就可以替换一组权限。设置所需的MIME TypeIntent Extras来插入日历事件或联系人。这样就不必请求日历和联系人的权限。
  • ACTION_IMAGE_CAPTURE 如果你的应用只是简单的拍张照片(或者拍个视频ACTION_VIDEO_CAPTURE) 并且返回结果,那么该Action就非常有用。
  • ACTION_PICK 该Action可以从联系人中选择一个联系人,并选择特定的数据(email, phone number, address),当在该应用中使用这个action时会授予一个临时的READ_CONTACTS权限用来读取联系人信息。
  • ACTION_VIEW 与ACTION_PICK共同使用时,此操作可用于查看所选的详细的联系人URI而不需要任何权限的授予。这个Action也可以通过在一个有效的定位目的数据来启动一个地图Intent。
  • ACTION_EDIT 如果与ACTION_PICK一起使用,返回的联系人信息中可以使用URI来编辑联系人的详细信息。
  • ACTION_DIAL 这个Action可以用来打开一个拨号器或者已经指定好电话号码的拨号界面。虽然它需要用户按下呼叫按钮(见ACTION_CALL),但它不需要使用任何相关的权限。
  • ACTION_SENDTO 这个Action可以用来组成一个SMS消息发送到特定的电话号码上。而不用授予权限的方式来发送SMS消息。(参见:ACTION_SEND ACTION_SEND_MULTIPLE)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值