跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Java大前端java

Android 判断权限是否开启的方法

Android 权限管理是应用开发中的关键环节。如何在 Android 应用中判断特定权限(如读写外部存储)是否已授予用户。通过 ContextCompat.checkSelfPermission 方法检查权限状态,若未授权则使用 ActivityCompat.requestPermissions 请求授权。在回调中处理用户选择,若拒绝可引导用户进入系统设置页面手动开启。代码示例包含权限检查逻辑、请求弹窗及引导设置的对话框布局实现。

GopherDev发布于 2025/2/7更新于 2026/9/875 浏览
Android 判断权限是否开启的方法

Android 权限检查与申请实现

定义权限数组

/**
 * 读写权限 自己可以添加需要判断的权限
 */
public static final String[] PERMISSIONS_READ = {
    Manifest.permission.READ_EXTERNAL_STORAGE,
    Manifest.permission.WRITE_EXTERNAL_STORAGE
};

判断权限集合

/**
 * 判断权限集合
 * @param context 上下文
 * @param permissions 权限数组
 * @return true-表示缺少权限 false-表示权限已开启
 */
public static boolean lacksPermissions(Context context, String[] permissions) {
  for (String permission : permissions) {
    if (lacksPermission(context, permission)) {
      return true;
    }
  }
  return false;
}

/**
 * 判断是否缺少权限
 */
private static boolean lacksPermission(Context context, String permission) {
  return ContextCompat.checkSelfPermission(context, permission) ==
      PackageManager.PERMISSION_DENIED;
}

Activity 中使用

// 检查权限
if (lacksPermissions(this, PERMISSIONS_READ)) {
  // 读写权限没开启
  ActivityCompat.requestPermissions(this, PERMISSIONS_READ, 0);
} else {
  // 读写权限已开启
}

权限设置回调

@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 0) { for (int i = 0; i < permissions.length; i++) { if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { // 权限被拒绝,弹出 dialog 提示去开启权限 showPermissions(); break; } } } }

弹出 Dialog 引导设置

private void showPermissions() {
  final AlertDialog dialog = new AlertDialog.Builder(mContext).create();
  View v = LayoutInflater.from(mContext).inflate(R.layout.dialog_permissions, null);
  dialog.setContentView(v);
  dialog.show();

  Button btn_add = v.findViewById(R.id.btn_add);
  Button btn_diss = v.findViewById(R.id.btn_diss);

  btn_add.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      dialog.dismiss();
      Intent intent = new Intent();
      intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
      intent.addCategory(Intent.CATEGORY_DEFAULT);
      intent.setData(Uri.parse("package:" + getPackageName()));
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      startActivity(intent);
    }
  });

  btn_diss.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      dialog.dismiss();
    }
  });
}

Dialog 布局 (dialog_permissions.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="250dp"
  android:layout_height="wrap_content"
  android:layout_gravity="center"
  android:background="@color/white"
  android:orientation="vertical">

  <TextView
    android:id="@+id/tv_title"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_gravity="center_vertical"
    android:gravity="center"
    android:text="提示"
    android:background="@color/zhuti_color"
    android:textColor="@color/white"
    android:textSize="16sp" />

  <TextView
    android:id="@+id/tv_hint"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/zhuti_color"
    android:layout_marginRight="10dp"
    android:layout_marginLeft="10dp"
    android:layout_marginTop="10dp"
    android:textSize="16sp"
    android:gravity="center"
    android:lineSpacingExtra="3dp"
    android:text="需要手动开启权限才能使用" />

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="15dp"
    android:gravity="center"
    android:orientation="horizontal">

    <Button
      android:id="@+id/btn_diss"
      android:layout_width="0dp"
      android:layout_weight="1"
      android:layout_height="30dp"
      android:background="@color/line2"
      android:text="取消" />

    <Button
      android:id="@+id/btn_add"
      android:layout_width="0dp"
      android:layout_weight="1"
      android:layout_height="30dp"
      android:layout_gravity="center"
      android:background="@color/zhuti_color"
      android:text="去设置"
      android:layout_marginLeft="20dp"
      android:textColor="@color/white" />

  </LinearLayout>

</LinearLayout>

目录

  1. Android 权限检查与申请实现
  2. 定义权限数组
  3. 判断权限集合
  4. Activity 中使用
  5. 权限设置回调
  6. 弹出 Dialog 引导设置
  7. Dialog 布局 (dialog_permissions.xml)

更多推荐文章

查看全部
  • JavaScript 中 null 与 undefined 的区别及使用场景
  • 低配环境运行 Qwen3Guard-Gen-WEB 的 CPU 部署实战指南
  • Vue 项目接口封装:Axios 配置与拦截器实践
  • 别再用 printf 了,自己造个 C++ 日志库
  • 开源 Remix Icon 图标库使用指南
  • 在Windows11利用llama.cpp调用Qwen3.5量化模型测试
  • Python 数据统计指南:从环境配置到高级分析
  • Python 实现 MCP 客户端调用高德地图天气查询示例
  • Android 开发中组件化的核心价值与架构实践
  • Web Unlocker API 实现 AI 训练网页数据集自动化获取
  • 合并 K 个升序链表
  • 从麦克斯韦到无人机:有感 FOC 与无感 FOC 的深度解析
  • Ubuntu 22 安装 ROS2 Humble 及 Gazebo
  • 前端监控最佳实践:错误捕获与性能分析
  • OmniSteward:基于 LLM Agent 的语音文字智能管家系统
  • Python 简介与入门
  • AI 赋能 FPGA 开发:Vivado 配置与智能编程实践
  • Xcode 真机调试报错:Developer Disk Image 无法卸载或挂载
  • Cursor 发布 Automations 功能,AI 全天候自动处理代码任务
  • 词岛 AI:学术论文写作辅助工具功能解析

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online