概述:

为了保护系统的完整性和用户隐私权,Android 在访问受限的沙盒中运行每款应用。

如果应用需要使用其沙盒以外的资源或信息,则必须明确请求权限。

根据应用请求的权限类型,系统可能会自动授予权限,也可能会要求用户授予权限。

权限最佳做法:

1.考虑使用intent 例子:MainActivity@ this.startActivityForResult(takeIntent, 1) -- 这个优先,使用简单方便

2.如果使用权限

  1. 仅要求您需要的权限,不要要求太多;
  2. 在需要的地方申请权限,而不是一次性申请;
  3. 解释需要权限的原因不要冗长;
  4. 拒绝权限需要有对应提示。

优缺点:

如果使用权限:

您的应用可在您执行操作时完全控制用户体验。不过,如此广泛的控制会增加任务的复杂性,因为您需要设计适当的 UI。

系统会在运行或安装应用时各提示用户提供一次权限(具体取决于用户的 Android 版本)。之后,应用即可执行操作,不再需要用户进行其他交互。不过,如果用户不授予权限(或稍后撤销权限),您的应用将根本无法执行操作。

如果使用 intent:

您无需为操作设计 UI。处理 intent 的应用将提供 UI。不过,这意味着您无法控制用户体验。用户可能与您从未见过的应用交互。

如果用户没有适用于操作的默认应用,则系统会提示用户选择一款应用。如果用户未指定默认处理程序,则他们每次执行此操作时都必须处理一个额外对话框。

使用权限做法:

1.在应用清单中声明需要的权限。

  1.1 在所有版本的 Android 中,您的应用都需要在其应用清单中同时声明它需要的正常权限和危险权限。

2.运行时请求用户授予权限。仅适用于运行 Android 6.0(API 级别 23)及更高版本的设备上的应用。

  2.1 系统在您声明权限之后的行为取决于权限的敏感性。如果权限不影响用户隐私权,系统会自动授权。

    如果权限可能涉及对敏感用户信息的访问,系统将要求用户审批请求。

    要了解有关不同种类权限的详细信息,请参阅正常权限和危险权限。

  2.2 使用 Android 支持库来检查和请求权限。Android 框架从 Android 6.0(API 级别 23)开始提供类似方法。

    不过,使用支持库更简单,因为在调用方法前,您的应用不需要检查它在哪个版本的 Android 上运行。

    (appcompat 库,通常情况下,名称以 …Compat(如 ActivityCompat)结束的类即是如此。)

2.3 要检查您是否具有某项权限,请调用 ContextCompat.checkSelfPermission() 方法。

  例如,以下代码段显示了如何检查 Activity 是否具有在日历中进行写入的权限:

  // Assume thisActivity is the current activity

  int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE_CALENDAR);

  如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回 PERMISSION_DENIED,且应用必须明确向用户要求权限。

package pers.hbolin.permissionsdemo

import android.Manifest
import android.app.Activity
import android.content.pm.PackageManager
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
import android.support.v7.app.AlertDialog
import android.util.Log
import kotlinx.android.synthetic.main.activity_main.*
import android.provider.MediaStore
import android.content.Intent
import android.graphics.Bitmap class MainActivity : AppCompatActivity() {
val TAG = "MainActivity" override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) callReadContacts() button.setOnClickListener {
// 使用Intent,可以不用在AndroidManifest.xml中配置权限
// 也不需要动态配置权限,即可调用
// 这里缺少判断,是否有东西响应这个Intent,不然会抛出异常的。
val takeIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
MainActivity@ this.startActivityForResult(takeIntent, 1)
}
} // 请求权限
private fun callReadContacts() {
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { Log.d(TAG, "未获取到权限") // Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) { // Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission. Log.d(TAG, "解释为什么需要权限") val builder = AlertDialog.Builder(this)
builder.setTitle("解释为什么需要权限")
.setMessage("因为是在测试")
.setPositiveButton("确定") { _, _ ->
// 申请权限
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_CONTACTS), 1)
}
.setNegativeButton("取消") { _, _ -> }
.create().show()
} else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_CONTACTS), 1) // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
} else {
Log.d(TAG, "已获取到权限")
}
} // 请求回调
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { if (requestCode == 1) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "权限同意")
} else {
Log.d(TAG, "权限禁止")
}
} } // startActivityForResult 回调
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
Log.d(TAG, "请求 $requestCode and 结果 $resultCode and data is null :${data == null}")
if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
if (data?.hasExtra("data") == true) {
Log.i(TAG, "data is not null")
val bitmap = data.getParcelableExtra<Bitmap>("data")
Log.d(TAG, "bitmap.width is ${bitmap.width}")
imageView.setImageBitmap(bitmap) //imageView即为当前页面需要展示照片的控件,可替换
}
}
}
}

Android 权限处理的更多相关文章

  1. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  2. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  3. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  4. android 权限大全

    教程 博客 淘帖     论坛›eoe·Android开发资源区›Android开发实例教程 191507 12 / 2 页下一页 android 权限大全 『癲瘋霸気』 于 2013-4-3 10: ...

  5. Android总结篇系列:Android 权限

    权限是一种安全机制.Android权限主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组件访问.在Android开发中,基本上都会遇到联网的需求,我们知道都需要加上联网所需要的权 ...

  6. Android权限列表permission说明

    网络上不乏android权限列表,但是很少有将列表和使用方法放在一起的,所以特此总结一下 需要在AndroidManifest.xml中定义相应的权限(以获取internet访问权限为例),如下: & ...

  7. Android权限设置android.permission

    android.permission.ACCESS_NETWORK_STATE: 允许程序访问有关GSM网络信息(Allows applications to access information a ...

  8. Android权限机制

    Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制, 很多像我这样的新手,尤其是习惯了windows低安全限制的用户,很容易在这方面弄混淆,下 ...

  9. Android权限安全(9)Android权限特点及权限管理服务AppOps Service

    Android权限特点 权限管理服务AppOps Service 图中元素介绍: Ignore 是不提示的,Allow 是允许,Reject 是拒绝 Client是一个使用sms 的应用, AppOp ...

  10. android权限列表

    原文:[转]android权限列表 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略 ...

随机推荐

  1. Python模块学习 - openpyxl

    openpyxl模块介绍 openpyxl模块是一个读写Excel 2010文档的Python库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl是一个比较综合的工具,能够同时读 ...

  2. ADO POST时出现“无法为更新定位行,一些值可能已在最后一次读取后已更改”问题的解决方法

    原因有这样几种: 1.在数据库设计时,为某些字段设置了默认值,在修改进行提交以后,数据库会自动修改对应字段的所有行的默认值,从而导致了数据库与数据集中数据的不一致,使ADOQuery无法对数据集进行定 ...

  3. 003 CopyOnWriteArrayList原理

    聊聊并发-Java中的Copy-On-Write容器 Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候 ...

  4. HDU 5129 Yong Zheng's Death

    题目链接:HDU-5129 题目大意为给一堆字符串,问由任意两个字符串的前缀子串(注意断句)能组成多少种不同的字符串. 思路是先用总方案数减去重复的方案数. 考虑对于一个字符串S,如图,假设S1,S2 ...

  5. 12-4 NSString

    原文:http://rypress.com/tutorials/objective-c/data-types/nsstring NSString 在本教程的内容可能我们已经看到过很多次了,NSStri ...

  6. 算法入门系列2:k近邻算法

    用官方的话来说,所谓K近邻算法(k-Nearest Neighbor,KNN),即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个 ...

  7. 在网站中嵌入VideoJs视频播放器

    一个博客难免需要引用视频来说明内容,但想要自己来实现一个视频播放器是不是一时半会就能完成的,更重要的是这需要对视频播放技术有一定的了解.于是自然而然的有人会想到开源项目.一个不错的选择便是video. ...

  8. 01 java 基础:jdk jre path classpath 相关问题

    JRE : Java 运行环境 JDK :  Java 开发工具包,其中包括 JRE  (javac.java.javap.jar.javadoc .javah 等命令) JVM : Java 虚拟机 ...

  9. 前端读者 | 前端构建工具Gulp

    @羯瑞 整理 前言 前端工具现在层出不穷,网上搜下一大片,就看你怎么去使用了,基于项目看用什么样的构建工具.有的工具提供的功能还是非常强大的. FIS.百度团队的产品.现在百度的多个产品中使用.面向前 ...

  10. 深刻剖析VuGen脚本录制原理

    扩展:深刻剖析VuGen脚本录制原理 LR中的VuGen组件,主要扮演一个proxy server的角色,在录制脚本时,记录下用户和服务器交互,然后自动生成脚本语言.在接下来的重放,或者大批量地加压时 ...