1.在AndroidManifest文件中添加需要的权限。
<uses-permission android:name="android.permission.CALL_PHONE" />
2.检查权限
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
//
}else{
//
}
这里涉及到一个API,ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。
3.申请授权
//参1:context对象, 参2:权限组, 参3:请求码-requestCode
ActivityCompat.requestPermissions(
thisActivity,
new String[]{
Manifest.permission.READ_CONTACTS
},
MY_PERMISSIONS_REQUEST_READ_CONTACTS
);
该方法是异步的,
第一个参数是Context;
第二个参数是需要申请的权限的字符串数组;
第三个参数为requestCode,主要用于回调的时候检测。可以从方法名requestPermissions以及第二个参数看出,是支持一次性申请多个权限的,系统会通过对话框逐一询问用户是否授权。
//上文中的MY_PERMISSIONS_REQUEST_READ_CONTACTS是一个int类型的常量, 当前的值为1;
4.处理权限申请回调
//参1 参2 参3
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// 如果请求被取消,结果数组是空的。
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限被允许
} else {
// 权限被拒绝
}
return;
}
}
}
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
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.
}
这个API主要用于给用户一个申请权限的解释,该方法只有在用户在上一次已经拒绝过你的这个权限申请。也就是说,用户已经拒绝一次了,你又弹个授权框,你需要给用户一个解释,为什么要授权,则使用该方法。
5.总结:
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 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.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity, new String[]{ Manifest.permission.READ_CONTACTS }, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
案例(android6.0以后的拨打电话功能):
//打电话按钮
public void testCall(View view){
//判断是否有权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){
//没有权限, 申请权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE);
} else{
//有权限
callPhone();
}
}
public void callPhone(){
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "10086");
intent.setData(data);
startActivity(intent);
}
//申请权限的结果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
//判断请求码是不是我们定义的请求码
if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE){
//是我们请求的权限, 判断权限是否请求成功
if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
//权限请求成功
callPhone();
} else{
//权限请求失败, 被拒绝
Toast.makeText(MainActivity.this, "无法使用该功能, 权限被拒绝, 请前往设置中心授权", Toast.LENGTH_SHORT).show();
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
本文借鉴了 "张鸿洋" 大神的博客,
他本人原文地址: http://blog.csdn.net/lmj623565791/article/details/50709663
他本人博客地址: http://my.csdn.net/lmj623565791
网友评论