一、效果展示
二、实现步骤
1.使用时在申请权限
首先想要应用拥有权限,那么一开始就要在清单文件Manifest中添加相关语句:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
如果是Android6.0以上才用动态申请权限,也就是下面要讲的。
第一步,检查APP是否开启了指定权限,这里使用ContextCompat的checkSelfPermission方法,该方法的第一个参数为活动实例,第二个参数为待检查的权限名称。
第二步,请求系统弹窗,以便用户选择是否开启权限。调用ActivityCompat的requestPermissions方法,即可命令系统自动弹出权限申请窗口,该方法的第一个参数为活动实例,第二个参数为待申请的权限名称数组,第三个参数为本次操作的请求代码。
第三步,判断用户的权限选择结果。回调方法onRequestPermissionsResult,如果当前页面请求弹出权限申请窗口,那么该页面的Java代码必须重写onRequestPermissionsResult方法,并在该方法内部处理用户的权限选择结果。
完整代码:
先写个工具类PermissionUtil
public class PermissionUtil {
//判断是否所有权限都被批准
public static boolean checkGrant(int[] grantResults){
if(grantResults!=null){
for(int grant:grantResults){
if(grant==PackageManager.PERMISSION_DENIED)
return false;
}
}
return true;
}
public static boolean checkPermission(Activity activity,String permission,int requestCode){
return checkPermissions(activity,new String[]{permission},requestCode);
}
public static boolean checkPermissions(Activity activity,String[] permissions,int requestCode)
{
//在Android6.0之后才需要获取动态权限
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
int check= PackageManager.PERMISSION_GRANTED;
for(String permission:permissions){
//监测permission权限是否批准
check=ContextCompat.checkSelfPermission(activity,permission);
if(check!=PackageManager.PERMISSION_GRANTED){ //当前权限没开启
//请求系统弹窗,申请权限
ActivityCompat.requestPermissions(activity,permissions,requestCode);
return false;
}
}
}
return true;
}
}
Activity代码:
public class applyPermission extends AppCompatActivity implements View.OnClickListener {
//通讯录所需要的权限
private final String[] PERMISSION_CONTACTS=new String[]{
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS,
};
//短信所需要的权限
private final String[] PERMISSION_SMS=new String[]{
Manifest.permission.READ_SMS,
Manifest.permission.SEND_SMS,
};
private final int REQUEST_CONTACTS=1; //获取通讯录权限的请求代码
private final int REQUEST_SMS=2; //获取短信全权限的请求代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_apply_permission);
findViewById(R.id.bt_contacts).setOnClickListener(this);
findViewById(R.id.bt_sms).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_contacts:
PermissionUtil.checkPermissions(this,PERMISSION_CONTACTS,REQUEST_CONTACTS);
break;
case R.id.bt_sms:
PermissionUtil.checkPermissions(this,PERMISSION_SMS,REQUEST_SMS);
break;
}
}
//ActivityCompat.requestPermissions的回调函数
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode)
{
case REQUEST_CONTACTS:
if(PermissionUtil.checkGrant(grantResults))
Toast.makeText(this, "通讯录权限获取成功!", Toast.LENGTH_SHORT).show();
else {
Toast.makeText(this, "通讯录权限获取失败!", Toast.LENGTH_SHORT).show();
jumpToSettings(); //跳转到应用设置界面
}
break;
case REQUEST_SMS:
if(PermissionUtil.checkGrant(grantResults))
Toast.makeText(this, "短信权限获取成功!", Toast.LENGTH_SHORT).show();
else {
Toast.makeText(this, "短信权限获取失败!", Toast.LENGTH_SHORT).show();
jumpToSettings();
}
}
}
//跳转到应用设置页面
public void jumpToSettings(){
Intent intent=new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", getPackageName(), null));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
2.启动时申请权限
这种情况大多出现在刚安装完软件,进入软件的时候。
这种情况只用稍微修改下上面的代码即可:
private final int REQUEST_ALL=3;
private final String[] PERMISSION_ALL=new String[]{
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS,
Manifest.permission.READ_SMS,
Manifest.permission.SEND_SMS
}; //这个是所有用到的权限,全部放到这里
在activity 的onCreate方法中加入下面的语句:
PermissionUtil.checkPermissions(this,PERMISSION_ALL,REQUEST_ALL);