当前位置: 首页 > news >正文

Android——运行时动态申请权限

  • 检查App是否开启了指定权限

调用ContextCompat.checkSelfPermission

  • 请求系统弹出弹窗,以便用户选择是否开启权限

调用ActivityCompat.requestPermissions方法,打开系统权限申请弹窗

  • 判断用户权限选择结果

重写活动页面的权限请求回调方法onRequestPermissionsResult,在该方法内部处理用户的权限选择结果

package com.example.cpclient;import android.Manifest;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;import com.example.cpclient.util.PermissionUtil;public class PermissionLazyActivity extends AppCompatActivity implements View.OnClickListener {private static final String[] PERMISSION_CONTACTS = new String[]{Manifest.permission.READ_CONTACTS,Manifest.permission.WRITE_CONTACTS,};private static final String[] PERMISSION_SMS = new String[]{Manifest.permission.READ_SMS,Manifest.permission.SEND_SMS,};private static final int REQUEST_CONTACTS_CODE = 1;private static final int REQUEST_SMS_CODE = 2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_permission_lazy);findViewById(R.id.contacts).setOnClickListener(this);findViewById(R.id.sms).setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.contacts:PermissionUtil.checkPermission(this, PERMISSION_CONTACTS, REQUEST_CONTACTS_CODE);break;case R.id.sms:PermissionUtil.checkPermission(this, PERMISSION_SMS, REQUEST_SMS_CODE);break;}}// 给用户打开请求权限系统弹窗后,用户操作的回调@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);Log.d("AAAA",Integer.toString(requestCode));switch (requestCode) {case REQUEST_CONTACTS_CODE:if (PermissionUtil.checkGrant(grantResults)) {Log.d("AAAA", "通讯录权限获取成功");} else {jumpToSettings();}break;case REQUEST_SMS_CODE:if (PermissionUtil.checkGrant(grantResults)) {Log.d("AAAA", "短信权限获取成功");} else {jumpToSettings();}break;}}private 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);}
}
package com.example.cpclient.util;import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;public class PermissionUtil {// 多个权限返回true表示有权限,false没有开启权限public static boolean checkPermission(Activity act, String[] permissions, int requestCode) {// Android6.0之后开始采用动态权限管理if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {int checkCode = PackageManager.PERMISSION_GRANTED;for (String permission : permissions) {checkCode = ContextCompat.checkSelfPermission(act, permission);if (checkCode != PackageManager.PERMISSION_GRANTED) {break;}}// 未开启权限,请求系统弹窗,好让用户选择是否开启权限if (checkCode != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(act, permissions, requestCode);return false;}}return true;}public static boolean checkGrant(int[] grantResults) {if (grantResults != null) {for (int grant : grantResults) {if (grant != PackageManager.PERMISSION_GRANTED) {return false;}}return true;}return false;}
}

案例代码


http://www.mrgr.cn/news/37006.html

相关文章:

  • AIGAME平台的由来与未来展望 —— 蒙特加密基金推动区块链与AI融合创新
  • 红黑树|定义、左旋函数、右旋函数和对插入结点的修复
  • 【系统架构设计师】需要掌握的专业术语200个及简称
  • HttpServletRequestWrapper这个类有什么作用?
  • (done) 使用泰勒展开证明欧拉公式
  • vscode【实用插件】Project Manager 项目管理
  • 2.2 HuggingFists中的编程语言
  • 2023_Spark_实验十:Centos_Spark Local模式部署
  • 【重学 MySQL】四十、SQL 语句执行过程
  • C++类和对象——第二关
  • 从自身经历浅谈对于C++/Java的认识
  • 华为NAT ALG技术的实现
  • 鸿蒙开发(NEXT/API 12)【硬件(取消注册智慧出行连接状态的监听)】车载系统
  • 【Java】字符串处理 —— String、StringBuffer 与 StringBuilder
  • 找到你的工具!5款免费可视化报表工具对比分析
  • 什么是 Servlet? 它的主要用途是什么?
  • 行情叠加量化,占据市场先机!
  • WAF,全称Web Application Firewall,好用WAF推荐
  • UGUI动态元素大小的滑动无限列表
  • 哈希表(一)