Android权限 - 第一篇

本站翻译自 Android Permissions Part 1

Marshmallow提出了一套新的权限模型,在这一系列的文章中,我们将从技术上探讨如何处理权限问题,以及如何让用户体验更友好。

首先,我们需要将应用所需要的权限进行分类:核心权限与增强功能权限,核心权限是指,应用核心功能所需要的权限,一旦这些权限获取不到,将无法正常工作,而增强功能权限是指,应用拿不到这个权限时,部分周边功能无法使用,使摄像头权限来说,对于一个相机类应用来说法,拿不到摄像头权限,就无法拍照,这个应用也就失去了意义。然而,其它功能比如:给已拍摄的照片打上位置坐标所需要的ACCESS_FINE_LOCATION就不是必需的。

接下来的内容,我们以RECORD_AUDIOMODIFY_AUDIO_SETTINGS权限来举例,为了能获取这2个权限,我们需要先在Manifest中做如下声明:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.stylingandroid.permissions">

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

    <application
        android:allowBackup="false"
        android:fullBackupContent="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme.NoActionBar"
        tools:ignore="GoogleAppIndexingWarning">

        <activity android:name=".MainActivity" />

        <activity
            android:name=".PermissionsActivity"
            android:label="@string/title_activity_permissions"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

这是自我们从Android API 1以来,获取权限的标准方式。当我们把targetSdkVersion指定为23或更大时,我们除了在Manifest中声明时,我们还需要在运行的时候申请。很多开发者,因为忘了在运行时申请,同时简单的把自己的targetSDKVersion指定为最高版本,从而导致了大量的Crash。因此,当我们把应用的targetSdkVersion升级时,我们首先要考虑的就是,关于权限的问题。

另个需要说明的是,现在有很多代码库用于简化我们在运行时期间的权限获取,这些库挺有用的,但我觉得我们需要真正弄明白这些库背后的处理流程,以及用户的选择。否则,使用这些库,将反过来给我们的应用带来问题。这是这一系列文章的主要目的。

Android系统将权限分为2大类,一类是危险的权限,比如RECORD_AUDIO,一类是普通的权限,比如MODIFY_AUDIO_SETTINGS。危险的权限是指会导致安全或隐私问题的权限,而普通的权限一般只是让应用获取应用域以外的数据,可能没有隐私问题或只是轻微的隐私问题。对于普通的权限,我们在Manifest中声明就好,而对于危险的权限,除了在Manifest中声明以外,还需要在运行时申请。

在应用中,我们首先需要确认的,就是我们是否已经获取了我们所需要的权限。在API 23及其以上的版本中,Context新增了一些方法用于处理权限相关的事情,当然,用ContextCompat来替代Context也是可以的。示例代码如下所示:

class PermissionsChecker {
    private final Context context;

    public PermissionsChecker(Context context) {
        this.context = context;
    }

    public boolean lacksPermissions(String... permissions) {
        for (String permission : permissions) {
        if (lacksPermission(permission)) {
            return true;
            }
        }
        return false;
    }

    private boolean lacksPermission(String permission) {
        return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED;
    }

}

对于方法ContextCompat#checkSelfPermission来说,他要么返回PackageManager.PERMISSION_DENIEDPackageManager.PERMISSION_GRANTED。在Marshmallow之前的Android版本,并不支持新的权限模型,checkSelfPermission()的逻辑为直接返回PackageManager.PERMISSION_GRANTED(如果有在Manifest中定义的话)。

接下来我们编写一个MainActivity类,在Activity中检查权限。并测试我们之前的代码。

public class MainActivity extends AppCompatActivity {
    private static final String[] PERMISSIONS = new String[] {Manifest.permission.RECORD_AUDIO, Manifest.permission.MODIFY_AUDIO_SETTINGS};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        PermissionsChecker checker = new PermissionsChecker(this);

        if (checker.lacksPermissions(PERMISSIONS)) {
            Snackbar.make(toolbar, R.string.no_permissions, Snackbar.LENGTH_INDEFINITE).show();
        }
    .
    .
    .
    }
}

Marshmallow之前的版本中,运行效果如下图所示:

Part1-lollipop.png

Marshmallow及其以后的版本中,如果我们没有给定权限,则运行结果如下图所示:

Part1-marshmallow

Android包管理框架:APK的安装流程

发布于:2年以前  |  3010次阅读  |  详细内容 »

Android 应用项目工程规范

本文档的目的是定义项目规范。这些应遵循整个 Android 项目以帮助我们保持整洁和统一的代码库。 翻译自:project_style_guidelines.md 1. 项目规范 1.1 项目结构 一个完整的...

发布于:2年以前  |  1752次阅读  |  详细内容 »

Android权限 - 第一篇

本站翻译自 Android Permissions Part 1 Marshmallow提出了一套新的权限模型,在这一系列的文章中,我们将从技术上探讨如何处理权限问题,以及如何让用户体验更友好。 首...

发布于:2年以前  |  2511次阅读  |  详细内容 »

两分钟彻底让你明白Android Activity生命周期(图文)

首先看一下Android api中所提供的Activity生命周期图(不明白的,可以看完整篇文章,在回头看一下这个图,你会明白的): ![]( http://codingsky.oss-cn-hangzhou.aliyuncs.co...

发布于:2年以前  |  2704次阅读  |  详细内容 »

Genymotion下载及安装使用

官文网站 :https://www.genymotion.com/ 1 介绍 Genymotion是一款出色的跨平台的Android模拟器,具有容易安装和使用、运行速度快的特点,是Android开发、测试等相关人员...

发布于:2年以前  |  2150次阅读  |  详细内容 »

SourceTree,让你忘掉Git命令的工具

发布于:2年以前  |  2665次阅读  |  详细内容 »

Fiddler介绍

发布于:2年以前  |  1539次阅读  |  详细内容 »

推荐一款全平台的SQlite管理工具: DB Browser for SQLite

官方网站:http://sqlitebrowser.org/,另外,这个工具还是完全开源的,开源地址:https://github.com/sqlitebrowser/sqlitebrowser 先上图: 关于DB Browser for SQLite...

发布于:2年以前  |  1594次阅读  |  详细内容 »

使用 JD-GUI 看找Jar包,class 文件的源代码

JD-GUI 的官方地址 : http://jd.benow.ca/ 对于Java开发人员来说,提供了一大堆第三方jar包,class文件,而没有源代码的话是非常痛苦的,特别是debug调试的时候,当然你...

发布于:2年以前  |  1712次阅读  |  详细内容 »

Google Java编程风格规范(中文版)

前言 这份文档是Google Java编程风格规范的完整定义。当且仅当一个Java源文件符合此文档中的规则, 我们才认为它符合Google的Java编程风格。 与其它的编程风格指南一样,这...

发布于:2年以前  |  2640次阅读  |  详细内容 »

Android包管理框架:APK的打包流程

发布于:2年以前  |  3613次阅读  |  详细内容 »

Android包管理框架:APK的加载流程

发布于:2年以前  |  2610次阅读  |  详细内容 »

Android窗口管理框架:Android应用窗口管理服务WindowServiceManager

发布于:2年以前  |  3739次阅读  |  详细内容 »

Android窗口管理框架:Android窗口管理框架概述

发布于:2年以前  |  2900次阅读  |  详细内容 »

Android窗口管理框架:Android布局解析者LayoutInflater

发布于:2年以前  |  2622次阅读  |  详细内容 »

Android组件管理框架:Android应用上下文Context

发布于:2年以前  |  1535次阅读  |  详细内容 »

Android显示框架:WindowManagerService关于窗口的计算流程

发布于:2年以前  |  1795次阅读  |  详细内容 »

Android窗口管理框架:Android应用视图管理者Window

发布于:2年以前  |  2244次阅读  |  详细内容 »

Android窗口管理框架:Android列表控件RecyclerView

发布于:2年以前  |  2135次阅读  |  详细内容 »

Android窗口管理框架:Android应用视图载体View

发布于:2年以前  |  1700次阅读  |  详细内容 »

最多阅读

简化Android的UI开发 1年以前  |  441644次阅读
30分钟搭建一个android的私有Maven仓库 2年以前  |  3306次阅读
Android设计与开发工作流 1年以前  |  3219次阅读
Google Enjarify:可代替dex2jar的dex反编译 2年以前  |  3113次阅读
Android多渠道打包工具:apptools 2年以前  |  2670次阅读
Google Java编程风格规范(中文版) 2年以前  |  2640次阅读
Android UI基本技术点 2年以前  |  2630次阅读
Android Studio 生成so文件 及调用 9月以前  |  2527次阅读
Android权限 - 第一篇 2年以前  |  2511次阅读
Stetho 2年以前  |  2436次阅读
2015 Google IO带来的新 Android 开发工具 2年以前  |  2371次阅读
Android死锁初探 9月以前  |  2363次阅读
听FackBook工程师讲*Custom ViewGroups* 2年以前  |  2285次阅读