You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android权限管理类开发:调用权限检查时应用崩溃求助

Android统一权限管理类崩溃排查与修复方案

常见崩溃原因

  • 传递的Activity/Context实例为null,触发空指针异常
  • 误用Application Context调用requestPermissions(该方法仅支持Activity实例)
  • 未在Manifest中声明目标权限
  • 权限检查API使用错误(比如直接调用过时的checkPermission而非ContextCompat.checkSelfPermission)

正确的Permissions类实现

import android.app.Activity;
import android.content.pm.PackageManager;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;

public class Permissions {
    // 检查通讯录读取权限是否已授予
    public static boolean hasReadContactsPermission(Activity activity) {
        if (activity == null) {
            throw new IllegalArgumentException("Activity实例不能为空");
        }
        return ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_CONTACTS)
                == PackageManager.PERMISSION_GRANTED;
    }

    // 请求通讯录读取权限
    public static void requestReadContactsPermission(Activity activity, int requestCode) {
        if (activity == null) {
            throw new IllegalArgumentException("Activity实例不能为空");
        }
        ActivityCompat.requestPermissions(activity,
                new String[]{Manifest.permission.READ_CONTACTS},
                requestCode);
    }
}

MainActivity正确调用方式

import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE_READ_CONTACTS = 1001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 权限检查与请求流程
        if (!Permissions.hasReadContactsPermission(this)) {
            Permissions.requestReadContactsPermission(this, REQUEST_CODE_READ_CONTACTS);
        } else {
            // 权限已授予,执行通讯录操作
            handleContactsAccess();
        }
    }

    // 处理权限请求结果
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE_READ_CONTACTS) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                handleContactsAccess();
            } else {
                Toast.makeText(this, "缺少通讯录权限,无法继续操作", Toast.LENGTH_SHORT).show();
            }
        }
    }

    // 模拟通讯录操作
    private void handleContactsAccess() {
        // 此处编写读取通讯录的业务逻辑
    }
}

必做配置与注意事项

  • 在AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
  • 确保调用权限方法时,Activity实例处于有效状态(避免在onDestroy之后调用)
  • 动态权限仅针对Android 6.0(API 23)及以上版本,低版本系统无需动态申请
  • 禁止使用Application Context调用requestPermissions,该方法依赖Activity的生命周期回调

内容的提问来源于stack exchange,提问作者N MZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 13:03:24