Android6 0权限机制(一):介绍

本篇文章已授权微信公众号 hongyangAndroid (鸿洋)独家发布 Android6.0权限机制(一):介绍 Android6.0权限机制(二):封装 Android6.0权限机制(三):6.0以前国产手机权限处理

为何google在6.0加入这个权限机制

android6.0之前其实也有权限机制,很简单就是开发者在manifest.xml注册,用户安装app时候,当做权限清单列出来告知用户我需要这些个权限,但是这样用户基本不会去看,导致app权限滥用造成安全隐患。

权限分类

Android权限有100多种不可能每种都去运行时授权,因此google把权限分为两类: 1.普通权限:例如网络请求等,按照老的权限机制 2.危险权限:9种共24个(电话,短信,sd卡,位置,摄像头,传感器,日历,录音,联系人),就是我们要动态申请的。   用adb命令查看危险权限列表:(tip:记住9种24类)

adb shell pm list permissions -d -g
复制代码
Dangerous Permissions:group:android.permission-group.CONTACTSpermission:android.permission.WRITE_CONTACTSpermission:android.permission.GET_ACCOUNTSpermission:android.permission.READ_CONTACTSgroup:android.permission-group.PHONEpermission:android.permission.READ_CALL_LOGpermission:android.permission.READ_PHONE_STATEpermission:android.permission.CALL_PHONEpermission:android.permission.WRITE_CALL_LOGpermission:android.permission.USE_SIPpermission:android.permission.PROCESS_OUTGOING_CALLSpermission:com.android.voicemail.permission.ADD_VOICEMAILgroup:android.permission-group.CALENDARpermission:android.permission.READ_CALENDARpermission:android.permission.WRITE_CALENDARgroup:android.permission-group.CAMERApermission:android.permission.CAMERAgroup:android.permission-group.SENSORSpermission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATIONpermission:android.permission.ACCESS_FINE_LOCATIONpermission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGEpermission:android.permission.READ_EXTERNAL_STORAGEpermission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONEpermission:android.permission.RECORD_AUDIOgroup:android.permission-group.SMSpermission:android.permission.READ_SMSpermission:android.permission.RECEIVE_WAP_PUSHpermission:android.permission.RECEIVE_MMSpermission:android.permission.RECEIVE_SMSpermission:android.permission.SEND_SMSpermission:android.permission.READ_CELL_BROADCASTS
复制代码

看到上面的dangerous permissions,会发现一个问题,好像危险权限都是一组一组的那么有个问题:分组对我们的权限机制有什么影响吗?的确是有影响的,如果app运行在Android 6.x的机器上,对于授权机制是这样的。如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。此外,对于申请时弹出的dialog上面的文本说明也是对整个权限组的说明,而不是单个权限(ps:这个dialog是不能进行定制的)。不过需要注意的是,不要对权限组过多的依赖,尽可能对每个危险权限都进行正常流程的申请,因为在后期的版本中这个权限组可能会产生变化。

怎么兼容

1.假设我们的项目之前没加这个权限机制,那现在我们怎么处理呢,要不要加这个权限判断,这个取决与app的版本兼容性也就是你们是否愿意为Android6.0以上的用户们处理这个问题。targetSdkVersion这个属性就是控制是否要引入权限机制的开关。

  • 项目中targetSdkVersion<23: 按照老的权限机制,只在manifest声明就可以了,运行不会报错,但是会有隐患: 比如,我的APP有个拨号功能,把targetSdkVersion=21,安装到API23(Android6.0)的设备,可以正常拨号,看似正常。 但是用户可以直接去设置里面关掉权限:

我在模拟器上有这个警告提示,但不保证所有手机都会有这个提示!这时再打开APP就无法拨号了,由于没有检查权限,用户得不到任何提示,一脸懵逼。

  • targetSdkVersion>=23: 这时就需要在代码中检查权限了,否则打开app去执行需要权限的操作会崩溃。如果关闭权限将会弹出提示框提示你开启权限。

2.如果app原先的targetSdkVersion低于23,现在升级到targetSdkVersion=23的app,那么里面的权限默认全部开启!除非用户卸载重装这个app,才是默认关闭所有权限

关于读写SD卡权限

在6.0之前由于读写SD没有限制,导致sd卡目录被app滥用,于是google把sd卡续写权限列为危险权限,如果开发者不想申请sd卡读写权限,可以访问0/Android/data/包名 这个目录,不需要权限可以随便访问,Android也是建议开发者将这个目录作为app的缓存目录

使用

  • 首先配置build.gradle,targetSdkVersion版本应该>=23,然后导入support-v4包:
apply plugin: 'com.android.application'android {compileSdkVersion 23buildToolsVersion "25.0.2"defaultConfig {applicationId "com.example.carmelo.myapplication"minSdkVersion 19targetSdkVersion 23versionCode 1versionName "1.0"}buildTypes {release {minifyEnabled false}}}
dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile 'com.android.support:support-v4:23.2.1'
}
复制代码
  • manifest.xml声明权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
复制代码
  • 在Activity或者Fragment中判断是否开启了这个权限,如果开启了就拨号,没有的话就申请权限:

界面弹出框:拒绝或者同意,回调两种结果:

[图片上传中。。。(2)]

public class MyActivity extends Activity {private Button btn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity);btn = (Button) findViewById(R.id.textView);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int check = ContextCompat.checkSelfPermission(MyActivity.this, Manifest.permission.CALL_PHONE);if(check== PackageManager.PERMISSION_GRANTED){call();}else {ActivityCompat.requestPermissions(MyActivity.this,new String[]{Manifest.permission.CALL_PHONE}, 1);}}});}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if(requestCode==1){if(grantResults[0]==PackageManager.PERMISSION_GRANTED){call();}else {Toast.makeText(MyActivity.this,"没有拨打电话权限",Toast.LENGTH_SHORT).show();}}}private void call(){Intent intent = new Intent();intent.setData(Uri.parse("tel://1212121212"));intent.setAction(Intent.ACTION_CALL);startActivity(intent);}
}
复制代码
  • 不再提示的处理: 如果用户勾选了不再提示,并且拒绝了权限,那么后面不会再弹框,并且结果一直回调到没有权限,此时根据产品需求处理,一般2种方法:
  1. 在回调中弹出Dialog跳到设置界面开启权限
  2. 直接弹出提示:没有权限(这种更好),因为用户就是拒绝了权限,不要烦他了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MAX10 ADC的一些基知识

MAX10 ADC 的一些知识 1、 MAX 10 内部集成的12bit SAR ADC的特点为&#xff1a; a、 采样速率高达1Mhz. b、 模拟通道多达18个&#xff0c;单个ADC多达17个&#xff0c;双ADC器件中有16个双功能ADC通道&#xff0c;2个专用的ADC。 c、 提供单端测…

Blazor University (42)JavaScript 互操作 —— 生命周期和内存泄漏

原文链接&#xff1a;https://blazor-university.com/javascript-interop/calling-dotnet-from-javascript/lifetimes-and-memory-leaks/生命周期和内存泄漏源代码[1]如果我们运行我们在从 Javascript 调用 .NET 中创建的应用程序并检查浏览器控制台窗口&#xff0c;我们会看到…

深入浅出聊布隆过滤器(Bloom Filter)

之前在网上看到过这么一段话&#x1f447; Data structures are nothing different. They are like the bookshelves of your application where you can organize your data. Different data structures will give you different facility and benefits. To properly use the …

第五周作业

本周作业内容&#xff1a;显示当前系统上root、fedora或user1用户的默认shell&#xff1b;#egrep "^(root|user1|fedora)" /etc/passwd|cut -d: -f72、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行&#xff0c;形如&#xff1a;hello()&#xff…

我为什么卸载了今日头条

曾经的自媒体人自述。 两三年前自媒体热曾席卷中国互联网&#xff0c;当时短视频还不是很火&#xff0c;一般的自媒体人都是以撰写文章为主&#xff0c;各种微信公众号层出不穷&#xff0c;10W的俗称 爆文&#xff08;豹纹&#xff09;。后来以今日头条为领头的短视频自媒体出现…

appium执行iOS测试脚本并发问题

appium1.4.XiOS9.Xxcode7.X: appium1.4.xiOS9.xxcode7.x&#xff0c;这一整套的配置做移动端自动化测试是测试人员常用的测试框架。关于&#xff0c;这一套测试框架的并发问题&#xff1a;基于mac端&#xff0c;启动多台appium服务器会导致appium的运行出错。这是因为多个appiu…

WinForm(五)控件和它的成员

窗体无疑是WinForm的主角&#xff0c;每个窗体都是用一个class来承载&#xff0c;那么窗体的控件&#xff0c;就是类中的私有字段了。每个窗体有三个文件&#xff0c;两个.cs文件&#xff0c;是一个分部类&#xff0c;Designer.cs是自动生成的C#代码&#xff0c;一般是拖拽控件…

Atitit.异常处理 嵌套  冗长的解决方案

Atitit.异常处理 嵌套 冗长的解决方案 1. 异常处理的需要改进的地方1 2. 异常设计的初衷是, 在程序中出现错误时, 由程序自己处理错误, 尽量不要以exit(0)这种粗暴的方式中止程序. 1 3. 正常流程和异常流程的分离。2 4. “是药三分毒”&#xff0c; 任何事物有缺点&#xff0c…

一文详解|增长那些事儿

目录 增长的背景 1.1 增长的定义 1.2 如何判断事物是否在增长 1.3 如何判断事物能否持续增长 如何进行增长 2.1 寻找增长机会点&#xff08;人的能力&#xff09; 2.1.1 发散与收剑找机会点 2.1.2 实验分析验证 2.1.3 增长洞察提取策略 2.1.4 如何找到大机会 2.2 设…

在MVC项目中使用Ninject

项目结构图&#xff1a; App_start文件夹中的文件是VS自己创建的&#xff0c;其中NinjectWebCommon类在创建之初并不存在。后面会再次提到&#xff01; 添加一个Home控制器。代码如下&#xff1a; using EssentialTools.Models; using Ninject; using System; using System.Col…

linux IP、端口连通性测试

ssh -v -p 50001 root10.210.200.82转载于:https://www.cnblogs.com/kuiyeit/p/6723508.html

紧急通知:360 网站卫士前端公共库已停止服务

所有使用了360前端公共库的开发者和站长们&#xff0c;请及时更换你的前端库的链接&#xff08;主要是前端库和谷歌 fonts&#xff09;&#xff0c;否则网站打开速度会极慢&#xff0c;甚至会在 Chrome 浏览器中崩溃。 360前端公共库曾经提供的服务有&#xff1a; 前端公共库&a…

一文学会Autofac的基础操作:几种实现注册方式、3种注入方式、生命周期、AOP以及过滤器实现依赖注入...

前言&#xff1a;直接开干。使用Autofac进行服务注册实践&#xff1a;新建三个项目&#xff0c;分别是webapi项目 Wesky.Core.Autofac以及两个类库项目 Wesky.Core.Interface和Wesky.Core.Service。在Webapi项目下&#xff0c;引用Autofac的三个包&#xff1a;Autofac、Autofac…

解析互联网广告术语 CPM、CPC、CPA、CPS、CPL、CPR 是什么意思

1. CPM&#xff08;Cost per mille&#xff09;&#xff0c;每千次展现收费 这是一种最为常见的广告模式&#xff0c;也是很多网站流量变现的一种途径&#xff0c;这种广告不管计算点击&#xff0c;或者什么注册下载之类的转化&#xff0c;只要这个广告在网站上被正常的展现给…

JavaScript数组迭代方法(图解)

转载于:https://www.cnblogs.com/seanna/p/6724032.html

Rider调试ASP.NET Core时报thread not gc-safe的解决方法

新建了一个ASP.NET Core 5.0的Web API项目&#xff0c;当使用断点调试Host.CreateDefaultBuilder(args)时&#xff0c;进入该函数后查看中间变量的值&#xff0c;报错Evaluation is not allowed: The thread is not at a GC-safe point。在群里问了也没人回应&#xff0c;可能没…

The SDK platform-tools version ((23)) is too old to check APIs compiled with API 26;

好像是更新过啥SDK之后&#xff0c;项目一直在包名的那一行显示红线&#xff0c;不过是不报编译错误的&#xff0c;就是看着老扎心老扎心的&#xff0c;开始以为是指定的SDK版本的问题&#xff0c;修改后发现无效&#xff0c;最后找到方法解决&#xff1a; 打开SDK Manager ---…

oracle 各种日期函数格式和操作

2019独角兽企业重金招聘Python工程师标准>>> ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显示值:07 yyy three digits 三位年 显示值:00…

火山引擎李玉光:字节跳动大规模K8s集群管理实践

2022年5月31日&#xff0c;在CSDN云原生系列在线峰会第6期“K8s大规模应用和深度实践峰会”&#xff0c;火山引擎资深云原生架构师李玉光分享了《字节跳动大规模K8s集群管理实践》。 字节跳动云原生体系 字节跳动内部云原生技术的使用贯穿组织技术体系各层面&#xff0c;整体如…

(7)关于margin的一些想法2.0

这篇主要讨论的就是margin负值与float的关系。 首先&#xff0c;例子。 <!doctype html> <html> <head> <meta charset"utf-8"> <title>无标题文档</title> <style typetext/css> html,body{padding:0;margin:0;} div{wid…