Android6.0运行时权限
来源:互联网 发布:php 仿简书评论回复 编辑:程序博客网 时间:2024/06/06 05:36
从 Android 6.0(API 级别 23)开始,用户在使用软件时向其授予权限,而不是在安装时授权。这个方法可以简化安装过程,用户在安装或者更新软件时不需要授予权限。它还能让用户对应用的功能进行控制。例如一个摄影应用,他使用摄像头权限是正常的,但是用户无法理解这个应用要读取联系人信息。
系统权限分为两类:正常权限跟危险权限
- 正常权限不会直接给用户隐私权带来风险。在AndroidManifest.xml中注册就行。
- 危险权限会授予应用访问用户机密数据的权限。在AndroidManifest.xml中注册了危险权限,同时需要用户授权您的软件才能使用这个权限。
誉为哪些属于正常权限,哪些属于危险权限,大家去官网阅读。
https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous
简单的例子(6.0手机获取危险权限)
如果我们的app需要一个调用拨打电话的功能,这个时候就需要获取CALL_PHONE权限。我们来看看在6.0的手机上拨打电话代码需要怎么写:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private String[] perms = {Manifest.permission.CALL_PHONE}; private final int PERMS_REQUEST_CODE = 200; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btn_call_phone).setOnClickListener(this); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_call_phone) {//获取拨打电话的权限 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {//Android 6.0以上版本需要获取权限 requestPermissions(perms,PERMS_REQUEST_CODE);//请求权限 } else { callPhone(); } } } /** * 获取权限回调方法 * @param permsRequestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) { switch (permsRequestCode) { case PERMS_REQUEST_CODE: boolean storageAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED; if (storageAccepted) { callPhone(); } else { Log.i("MainActivity", "没有权限操作这个请求"); } break; } } //拨打电话 private void callPhone() { //检查拨打电话权限 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + "10086")); startActivity(intent); } }}
获取权限之前先判断版本号,版本大于6.0,就调用requestPermissions方法请求权限。这个方法有两个参数,参数一是要请求的权限数组,一次可以请求多个权限。参数2是一个int类型的请求标示。不管用户同意或者拒绝都会回调onRequestPermissionsResult方法。这个方法的permsRequestCode参数就是我们请求时第二个参数,然后判断permsRequestCode数组的第一个参数。值等于PackageManager.PERMISSION_GRANTED就是用户同意授权。否则用户拒绝授权这个权限。
获取特殊权限
Android特殊权限只有两种:SYSTEM_ALERT_WINDOW和WRITE_SETTINGS,
与正常权限跟危险权限不同。特殊权限比较敏感,因此大多数应用不应该使用它们。如果某应用需要其中一种权限,必须在清单中声明该权限,并且发送请求用户授权的 intent。系统将向用户显示详细管理屏幕,以响应该 intent。
首先我们判断android版本号是不是大于6.0,通过Settings.canDrawOverlays判断有没有系统弹窗权限。如果没有权限发送一个intent请求请求授权。
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1){ if (Settings.canDrawOverlays(this)) { systemAlert(); } else {//没有系统弹窗权限,发送一个设置权限的intent Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, PERMS_REQUEST_CODE); }}
重写onActivityResult方法,授权失败或者成功都会回调这个方法。在这里判断用户同意还是拒绝。
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PERMS_REQUEST_CODE) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //Android M 处理Runtime Permission if (Settings.canDrawOverlays(this)){//有系统弹窗权限 Log.i("MainActivity","获取系统弹窗(特殊权限)成功"); systemAlert(); } else { Log.i("MainActivity","拒绝系统弹窗(特殊权限)"); } } }}
申请这么多权限岂不是很累?
其实你不需要每个权限都去申请,举一个例子,如果你的应用授权了读取联系人的权限,那么你的应用也是被赋予了写入联系人的权限。因为读取联系人和写入联系人这两个权限都属于联系人权限分组,所以一旦组内某个权限被允许,该组的其他权限也是被允许的。
注意
在代码中请求了运行时权限,但是在Manifest.xml文件中一定要记住注册权限。
<uses-permission android:name="android.permission.CALL_PHONE"/><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
效果图如下
源码下载
源码下载
- Android6.0 运行时权限
- Android6.0 运行时权限
- Android6.0运行时权限
- 【Android6.0】运行时权限
- Android6.0 运行时权限
- Android6.0 运行时权限
- Android6.0 运行时权限
- Android6.0运行时权限
- Android6.0运行时权限
- Android6.0---运行时权限
- Android6.0运行时权限
- Android6.0运行时权限
- android6.0运行时权限
- Android6.0 运行时权限
- Android6.0运行时权限。
- Android6.0运行时权限
- Android6.0运行时权限
- Android6.0运行时权限
- Java正则去取出相应的值
- redis 官方集群配置,实践遇到的问题
- app与其它应用的交互
- Intellij Idea通过license server破解
- iOS性能优化总结
- Android6.0运行时权限
- 概率---抽奖
- 依赖注入 javax.inject中@Inject、@Named、@Qualifier和@Provider用法
- Java时间戳转换
- linux cat的用法
- LeetCode 题解 169. Majority Element(查找多数元素)
- 高并发Java 十 JDK8对并发的新支持
- Android模板制作
- 欢迎使用CSDN-markdown编辑器