详解Android运行时权限及APP适配方法

Android 6.0起,Android加强了权限管理,引入运行时权限概念。对于:

1. Android 5.1(API 22)及以前版本,应用权限必须声明在AndroidManifest.xml中,应用在安装时,Android会列出其所需的所有权限供用户确认安装。

2. Android 6.0(API 23)及以后版本,应用权限必须声明在AndroidManifest.xml中,但权限分为普通权限(Normal Permissions)和危险权限(Dangerous Permissions),以下会介绍区别:

普通权限:不会给用户隐私带来风险

应用声明在AndroidManifest.xml,系统会自动授予,无需应用申请。

危险权限:应用访问用户机密数据的权限,会有风险

1. 此权限也必须声明在AndroidManifest.xml中

2. 此类权限属于运行时权限,应用在启动后,需执行相关需此类权限的操作前,需调用系统API弹窗让用户授权,弹窗内容应用不可修改。如果缺少运行时权限(用户未授权),那么应用强行执行操作或调用API会引起APP FC。如下:

3-10 04:47:44.274 10405 8714 8714 E AndroidRuntime: java.lang.RuntimeException: Unable to create service xxxxxx.SmsBackgroundService: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.telephony.MmsSmsProvider from ProcessRecord{48bbdaa 8714:xxxxxx/u0a405} (pid=8714, uid=10405) requires android.permission.READ_SMS or android.permission.WRITE_SMS

行时权限的三种状态:允许,询问(USER_SET),拒绝(USER_FIXED)。用户可以在系统的权限管理中管理应用的每一项权限的状态。

那么,应用该如何适配运行时权限,其标准做法是什么?

1. 在AndroidManifest.xml列出所有所需的权限,包括普通权限和危险权限

2. 应用启动后,需调用所需运行时权限的API前,先调用系统API,如checkSelfPermission来查询自身是否已获取相关权限,如已获取,可继续正常执行API或后续操作等,下面用伪代码表示:

if (checkSeflPermission(...)) {
    // 应用未获取此危险权限
   if (shouldShowRequestPermissionRationale(...)) {
       // 用户对此权限是拒绝状态,此时应用可自行弹窗告知用户,注意:如果用户在拒绝时勾选了“不再询问”,此方法会返回false,不再可靠,则可在onRequestPermissionsResult方法中再执行类似以下操作
       // 例如百度地图的做法,会弹窗,告知用户缺少相关权限,请点击跳转到设置页面,进行权限开启,这也是多数应用的标准做法
       // ......
   } else {
       // 用户对此权限是询问状态,应用可调用系统API弹窗去申请权限,用户操作结果可在overload方法onRequestPermissionsResult中处理
       requestPermissions(...);
   }
} else {
    // 已有此危险权限,后面可放心执行相关操作
    // .....
}

最后,列出所有的危险权限,注意,这里有权限组(Permission Groups)的概念,申请某个具体的权限时,系统在弹窗中只会告知用户应用所需访问的权限组,并不会描述该具体权限。如果某个权限组中,应用一个权限都还没被授权,则会弹窗供用户选择授权;如果某个权限组中,应用已被授权了其中一个权限,那么应用再次申请同一个权限组内其他权限时,会被自动默认授权。

您可能感兴趣的文章:

  • 如何在Android App中集成支付宝和微信支付功能
  • Android AIDL实现两个APP间的跨进程通信实例
  • Android使用AIDL实现两个App间通信
  • Android控件实现直播App特效之点赞飘心动画
  • Android 如何使用短信链接打开APP
  • Android SwipeRefreshLayout仿抖音app静态刷新
  • Android实现京东App分类页面效果
  • Android实战APP启动速度优化
时间: 2018-03-17

Android使用AIDL实现两个App间通信

今天开发了一个功能,通过Android的AIDL机制完成两个app间的通信.功能需求很简单,一个客户端app,叫做client,一个服务端app叫orderManager:客户端负责展示订单列表,并且可以向服务端添加订单:服务端负责管理订单,可以对外提供订单信息. 闲言少叙,下面直接上代码. 1.编写bean类. 首先在client中定义OrderBean类,字段很简单,注意需要实现Parcelable接口: package com.example.wang.client.bean; impor

Android实现京东App分类页面效果

今天群里有人问了关于仿京东App分类页面的实现,而我之前正好查过这方面的资料,手上正好有一个demo,正好分享给大家看看,个人觉得效果棒棒哒! 首先来看效果图吧 是不是很6呢,来分析这个demo的主体构成吧,顶部为搜索栏,左侧是scroview,不要担心优化问题,因为scroview里面的TextView是动态生成的,完全不用担心优化问题,右侧是viewPager,Scroview可以控制viewPager的滑动,反之ViewPager也可以控制scroview的滑动. 闲话少说,直接上代码:

Android 如何使用短信链接打开APP

短信链接跳转APP 平时我们会收到广告短信,比如某东,某宝,里面附加着链接,当你点开链接(手机自带的浏览器),发现浏览器打开后,等一下下,就会打开对应的APP,直接到广告相应的页面. Android端的代码 从简单的开始,第一个启动的Activity先来处理 <activity android:name=".activity.ActivityFirst"> <intent-filter> <action android:name="android

Android SwipeRefreshLayout仿抖音app静态刷新

SwipeRefreshLayout的功能就是可以让我们的界面在不动的情况下,下拉直接刷新 废话不多说,效果图奉上: activity_listview布局文件 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/sr1" android:layout_width="match_parent" android:layout_height="match_parent"&

如何在Android App中集成支付宝和微信支付功能

前言 本文主要介绍如何在 Android App 里集成支付宝和微信支付的功能,文中将实现的步骤一步步介绍的非常详细,对同样遇到这个问题的朋友相信会是一个很好的参考,下面话不多说了,来一起看看详细的介绍吧. 集成支付宝支付 没想到现在 App 里集成支付宝是这么的简单,我还折腾了好久- 好了,开始,假设你已经完成了支付宝那些繁杂的申请啥的工作,进入开发了. 首先,去下载官方的 DEMO : App支付客户端DEMO&SDK. 导入开发资源 解压后把里面的 jar 包拿出来放到你工程的 lib 目

Android实战APP启动速度优化

APP启动速度非常重要,APP启动速度慢,可能会造成用户体验不良好,尤其是在最近用Android studio之后,如果长时间不打开app,启动速度就会特别的慢,下面我们一起探讨一下影响app启动速度的原因,以及解决方案. 检测启动时间 首先我们要知道app的启动时间,然后你也可以凭着感觉来,这里我教大家一个装逼的方法: adb shell am start -W [packageName]/[.MainActivity] 用adb命令可以检测启动时间,示例如下: ./adb shell am

Android控件实现直播App特效之点赞飘心动画

现在市面上直播类的应用可以说是一抓一大把,随随便便就以什么主题来开发个直播App,说白了就想在这领域分杯羹.在使用这些应用过程中其实不难发现,在所有的直播界面,少不了的就是各种打赏.各种点赞.今天自己就针对点赞功能敲了一下,代码不多,主要是涉及到动画运动轨迹运算,这里需借助 贝塞尔曲线 相关知识,我使用三阶贝塞尔曲线来实现轨迹动画. 运行效果 一.具体实现流程 仔细分析整个点赞过程可以发现,首先是"爱心"的出现动画,然后是"爱心"以类似气泡的形式向上运动. &quo

Android AIDL实现两个APP间的跨进程通信实例

本文为大家分享了Android AIDL实现两个APP间的跨进程通信实例,供大家参考,具体内容如下 1 Service端创建 首先需要创建一个Android工程然后创建AIDL文件,创建AIDL文件主要为了生成继承了Binder的Stub类,以便应用Binder进行进程间通信 servier端结构如下 AIDL代码如下 // IBookManager.aidl package com.example.bookserver.aidl; // Declare any non-default type

Android编程实现AIDL(跨进程通信)的方法详解

本文实例讲述了Android编程实现AIDL(跨进程通信)的方法.分享给大家供大家参考,具体如下: 一. 概述: 跨进程通信(AIDL),主要实现进程(应用)间数据共享功能. 二. 实现流程: 1. 服务器端实现: (1)目录结构,如下图: (2)实现*.aidl文件: A. IAIDLService.aidl实现: package com.focus.aidl; import com.focus.aidl.Person; interface IAIDLService { String getN

android使用AIDL跨进程通信(IPC)

AIDL的作用 AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码.如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数. AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级.它是使用代理类在客户端和实现端传

Android AIDL实现跨进程通信的示例代码

AIDL是Android接口定义语言,它可以用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能. 实现步骤 例:用 A程序去访问 B程序的MyService.java服务 在B中建立AIDL文件MyAidlService.AIDL,在AIDL文件里写我们的接口方法 在MyService中写AIDL文件定义的方法的具体服务逻辑 在B的manifest文件中,为Service添加action "com.xyb.servicetest.

android Web跳转到app指定页面并传递参数实例

下面将实现 Web跳转到app指定页面并传递参数 总结 先看效果图: h5页面代码: <!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <title

Android IPC机制利用Messenger实现跨进程通信

写作原因:跨进程通信的实现和理解是Android进阶中重要的一环.下面博主分享IPC一些相关知识.操作及自己在学习IPC过程中的一些理解.这一章使用Messenger实现跨进程通信,其中bindService基础部分参见Android IPC机制绑定Service实现本地通信. 跨进程简介 在介绍使用Messenger跨进程通信之前先要了解以下问题:为什么需要跨进程通信?只有有了需求才有学习的价值.我个人将不同进程简单的理解为不同的应用程序(当然也有例外,比如可以在同一个应用程序中开启两个或多个

Android通过AIDL在两个APP之间Service通信

一.项目介绍 [知识准备] ①Android Interface definition language(aidl,android接口定义语言),其目的实现跨进程的调用.进程是程序在os中执行的载体,一个程序对应一个进程,不同进程就是指不同程序,aidl实现不同程序之间的调用. ②主线程与子线程通信使用handler,handler可以在子线程中发出消息,在主线程处理消息,从而完成线程之间的通信,即使有多个线程,仍然是一个程序. ③不同程序之间需要通过aidl通信,通信方式可以有多种,aidl是

Android基于Aidl的跨进程间双向通信管理中心

得益于最近有点时间和精力,我想起来了一件事.那就是在上家公司,公司要求做一个APP进程间的通信的功能,并不是APP对APP的直接跨进程通信,而是通过一个服务中心,做接收,然后,再转发,避免应用之间耦合性高,不然的话,新增一个APP,其他APP也要进行升级更新(类似于有服务中心的聊天室). 我就花几个小时写点东西吧,顺便记录一下 大家都知道在Android设备上,有很多方式,比如,广播,socket,共享内存,aidl等,其中广播和aidl都是基于android中iBinder机制 广播: 广播有