请求单一权限

为了请求单一权限,我们可以使用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()方法就会被调用,在该方法内可以检查用户做出的授予或者拒绝操作@Overridepublic 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)


更多相关文章

  1. Android向Web站点发送GET请求、POST请求
  2. Android(安卓)apk安装管理(PackageManagerService 分析)
  3. HttpClient 多线程
  4. Android——api阅读记录
  5. Android(安卓)使用OKHttp获取字符串和下载图片
  6. 6.腾讯微博Android客户端开发——换取Access Token
  7. Android结合ButterKnife创建自己的BaseActivity(兼容6.0)
  8. android发送http请求—-URLConnection、HttpURLConnection的使用
  9. Android(安卓)普通权限、危险权限、运行时权限

随机推荐

  1. Android(安卓)Studio的功能列举
  2. Android(安卓)ConstraintLayout使用指南
  3. Android(安卓)中的 Service 全面总结(二)
  4. 更改android AVD模拟器创建路径位置
  5. Android(安卓)的第三方报表组件,AChartEng
  6. 【Android】android4.4从图库选择图片,获
  7. Android游戏引擎《Rokon》:主要类和方法的
  8. Android程序反编译
  9. 【读书笔记-《Android游戏编程之从零开始
  10. Android动态创建快捷方式