家资是何物,积帙列梁梠。这篇文章主要讲述Android 6.0版本以后运行时权限提醒相关的知识,希望能为你提供帮助。
android发布6.0以后对app运行所需要的权限提示进行了友好的提示,类似于苹果系统,比如在某个页面要用到打电话的权限,会弹出一个提示框,提示你是否需要同意这个权限,如果同意则app就有了打电话的权限,既可以拨打电话了,不同意则不能拨打电话,只能去设置中勾选,在6.0以前,权限配置都是在AndroidManifest.xml文件中添加例如:
< ?xml version="1.0" encoding="utf-8"?> < manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.ymx.dynamicpermissiondemo"> < uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"> < /uses-permission> < uses-permission android:name="android.permission.CALL_PHONE"> < /uses-permission> < /manifest>
在配置文件中添加了两个权限,一个是网络状态,一个是打电话权限。
在代码中设置拨打电话:
public class MainActivity extends AppCompatActivity {private Button mCallButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mCallButton = (Button) findViewById(R.id.call_button); mCallButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent callIntent = new Intent(); callIntent.setAction(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:" + "10086")); startActivity(callIntent); } }); } }
电话能够正常拨打出去
文章图片
如果没有注册权限的话,就会报相关异常了:
FATAL EXCEPTION: main Process: com.example.ymx.dynamicpermissiondemo, PID: 3147 java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxxxxxx cmp=com.android.server.telecom/.CallActivity } from ProcessRecord{3d45b392 3147:com.example.ymx.dynamicpermissiondemo/u0a59} (pid=3147, uid=10059) requires android.permission.CALL_PHONE at android.os.Parcel.readException(Parcel.java:1546)
现在来看看Android6.0版本是怎么实现运行时权限提醒的,首先在app的gradle中配置targetSdkVersion=25
package com.example.ymx.dynamicpermissiondemo; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends AppCompatActivity {private Button callButton; private static final int PERMISSION_REQUEST_CODE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); callButton = (Button) findViewById(R.id.call_button); callButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { checkPermission(); } }); } //检测用户是否同意权限 private void checkPermission(){ //判断所申请的权限是不是已经通过,没通过返回false,通过返回true,则提示出来并拨打电话 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){ //申请权限回调函数 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CALL_PHONE},PERMISSION_REQUEST_CODE); }else{ Toast.makeText(this,"权限已被申请通过咯!",Toast.LENGTH_SHORT).show(); call(); } } //打电话方法 private void call(){ Intent callIntent = new Intent(); callIntent.setAction(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel://10086")); startActivity(callIntent); } //权限申请回调方法 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode){ case PERMISSION_REQUEST_CODE: //同意申请的权限 if (grantResults.length> 0& & grantResults[0]==PackageManager.PERMISSION_GRANTED){ Toast.makeText(this,"同意通过",Toast.LENGTH_SHORT).show(); call(); //拒绝申请的权限 }else{ Toast.makeText(this,"拒绝通过",Toast.LENGTH_SHORT).show(); } break; default: break; }} }
可以看出来,定义很简单,在activity中写了三个方法,分别是打电话,权限校验,权限申请的回调函数,校验权限方法主要是用到了ContextCompat.checkSelfPermission方法,里边接收两个参数,第一个是activity的实例,第二个是你要申请的权限名称,PackageManager.PERMISSION_GRANTED这个参数表示权限已经通过的意思,和ContextCompat.checkSelfPermission的返回结果进行比较,然后做相应处理,如果已经通过了就Toast出来,然后直接拨打电话??,如果没有通过,就请求回调申请权限方法,
方法是ActivityCompat.requestPermissions,里边接收三个参数,一个是activity的实例,第二个是多个权限名称数组,第三个是requestCode,这个requestCode是不是很眼熟,和startActivityForResult中的一样,区分不同权限处理。
【Android 6.0版本以后运行时权限提醒】在onRequestPermissionsResult中判断用户是不是通过了某个权限,使用的是int[] grantResults参数,先判断它的长度,角标为0表示通过,即PackageManager.PERMISSION_GRANTED,角标为1表示未通过,即PackageManager.PERMISSION_DENIED,来看一下运行效果吧~~~
文章图片
最后还是别忘了在AndroidManifest.xml中注册相关的uses-permission,这个是不管哪个版本都需要注册的~~~
推荐阅读
- Frameworks detected: Android framework is detected in the project
- Android的学习总结
- android 编译打包烧录
- Android 软键盘控制方法以及开发中遇到的一些问题。转
- Android 系统中,那些能大幅提高工作效率的 API 汇总(持续更新中...)
- 浅谈Android保护技术__代码混淆
- ML(T分布随机邻居嵌入(t-SNE)算法)
- ML使用门控循环单位网络生成文本
- ML机器学习类型–第2部分