第一行代码 第7章 内容提供器 -- 运行时权限
来源:互联网 发布:犀牛软件 下载 编辑:程序博客网 时间:2024/05/21 17:53
Android运行时权限:
由android 6.0系统上引入了这个功能 , 允许用户在安装软件时不需要一次性授权所有的申请权限,而是可以在运行时对某一项权限申请进行授权。
Android将权限分为两类
一类是普通权限:不会直接威胁到用户安全和隐私的权限,由系统自动授权。
一类是危险权限:涉及用户隐私,和对设备安全性的权限,由用户手动授权,否则该应用程序无法使用该功能。
android的威胁权限一共是9组,24个权限。
权限组名 权限名CAMERA CAMERALOCATION ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATIONMICROPHONE RECOED_AUDIOSENSORS BODY_SESORSCALENDAR READ_CALENDAR WRITE_CALENDARCONTACTS READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTSSTORAGE READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGESMS SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_MMS RECEIVE_WAP_PUSHPHONE READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS
在进行运行时权限处理时,使用的是权限名,用户一旦同意授权了,那么该权限所对应的权限组中所有的其他权限也会同时被授权。
拨打电话功能实例:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sky.runtimepermissiondemo"> <uses-permission android:name="android.permission.CALL_PHONE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
MainActivity.java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnCall = (Button)findViewById(R.id.btnCall); btnCall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:10086")); startActivity(intent); } catch (SecurityException e) { e.printStackTrace(); } } }); }}
此程序在低于Android 6.0 系统的手机上都可以正常运行,但是在6.0或者更高版本系统的手机上运行,就会出现”Permission Denial”错误信息。所以需要进行运行时权限处理
运行时权限处理流程:
1、判断用户是否已经给过授权了。
使用ContextCompat.checkSelfPermission()方法。
该方法接收两个参数
第一个参数是Context
第二个参数是具体的权限名
然后利用该方法的返回值和PackageManager.PERMISSION_GRANTED做比较。
如果相等,则说明已经授权过,可以直接运行需要授权的程序;
如果不相等,则说明没有授权过,需要向用户申请授权。使用ActivityCompat.requestPermission()方法进行申请
该方法接收3个参数
第一个参数是Activity的实例
第二个参数是String数组,把要申请的权限名放在数组中
第三个参数是请求码
当调用requestPermission()方法以后,系统会弹出一个权限申请的对话框,由用户选择是否同意权限的申请。不管是同意还是拒绝,最终都会回调onRequestPermissionResult()方法。
该方法有三个参数
第一个参数requestCode,是requestPermission方法中传入的请求码
第二个参数permissions数组,是requestPermission方法中传入的String数组
第三个参数grantResults数组,是授权的结果
当用户同意权限后,就不再弹出一个权限申请的对话框,直接执行代码。
将MainActivity.java改成如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnCall = (Button)findViewById(R.id.btnCall); btnCall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1); }else { try { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:10086")); startActivity(intent); } catch (SecurityException e) { e.printStackTrace(); } } } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode){ case 1: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ try { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:10086")); startActivity(intent); } catch (SecurityException e) { e.printStackTrace(); } }else { Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show(); } break; default: } }}
- 第一行代码 第7章 内容提供器 -- 运行时权限
- 第一行代码-第7章 内容提供器
- [Android][第一行代码][第 7 章 内容提供器]
- 第一行代码 第7章 内容提供器 --基本用法
- 第一行代码 第7章 内容提供器 --实现跨程序数据共享
- 《第一行代码》读书笔记(十一)----内容提供器
- 《第一行代码--Android》读书笔记之内容提供器
- 第一行代码-7.1 内容提供器简介
- 第一行代码-7.3 创建自己的内容提供器
- Android第一行代码学习笔记五----内容提供器
- 内容提供器(ContentResolver)---《第一行代码Android》笔记
- 阅读郭林《第一行代码》的笔记——第7章 跨程序共享数据,探究内容提供器
- Android:在程序运行时申请权限(第一行代码android)
- 《第一行代码Android》(第二版)读书笔记(二):运行时权限
- 《第一行代码》学习之旅--第7章-内容提供者ContentProvider
- 权限(permission)---《第一行代码Android》笔记
- 第一行代码学习笔记,第七章 内容提供者
- 第一行代码笔记,第七章-----探究内容提供者
- 【ACF学习】ACF训练检测模型
- B+树和LSM比较
- 计算几何--POJ--1654--Area
- Android知识点:监听链接、桌面快捷方式
- 设计模式六大原则
- 第一行代码 第7章 内容提供器 -- 运行时权限
- C语言学习小结--参数个数可变的函数
- 【Git零基础教程】(7)改写历史(Rewriting History)
- 【Java】文件复制的各种姿势
- 放大镜
- 在使用inline-block时遇到的元素之间的间隔
- Linux下部署web项目常见的命令
- Can't connect to MySQL server on 'localhost' (10061)
- 回归- 决策树