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

Android中onRequestPermissionsResult的grantResults为空问题求助

Android API 26 中申请日历写入权限时 grantResults 为空的解决方案

我之前在API 26的模拟器上开发日历相关功能时,也碰到过一模一样的问题——申请WRITE_CALENDAR权限时,onRequestPermissionsResult里的grantResults是空数组,但requestCode是对的。折腾了好一阵才理顺问题,给你分享几个关键的排查和解决点:

  • 先检查Manifest的权限声明
    别小看这一步,要是漏了权限声明,整个权限申请流程都会异常。确保你的AndroidManifest.xml里已经加上了这两个权限:

    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    

    虽然API 26之后动态申请是必须的,但静态声明是基础,缺了它系统根本不会处理你的权限请求。

  • 核对权限回调的实现
    你的代码只贴了申请权限的部分,一定要确认onRequestPermissionsResult回调写对了,而且没有在申请权限后意外销毁Activity。比如如果调用requestPermissions之后立刻finish(),权限弹窗消失时Activity已经没了,自然收不到完整的回调结果。

    给你一个标准的回调实现参考:

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // 替换成你自己定义的请求码
        final int CALENDAR_WRITE_REQUEST = 1001;
        if (requestCode == CALENDAR_WRITE_REQUEST) {
            // 这里一定要先判断grantResults的长度,避免空指针
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限到手,开始写日历事件
                writeCalendarEvent();
            } else {
                Toast.makeText(this, "没有日历权限无法完成操作哦", Toast.LENGTH_SHORT).show();
            }
        }
    }
    
  • 模拟器的小bug处理
    API 26的模拟器偶尔会有系统权限管理的异常,你可以试试这几个操作:

    • 重启模拟器,然后卸载重装应用再测试
    • 手动进入模拟器的「设置-应用-你的应用-权限」,先清空所有权限,再重新触发应用的权限申请
    • 换一个API 26的系统镜像重新创建模拟器,有些镜像可能存在兼容性问题
  • 调整权限申请的时机
    尽量不要在Activity.onCreate()里太早触发权限申请,比如Activity还没完全初始化好的时候。最好在用户主动触发操作(比如点击「添加到日历」按钮)时再申请权限,这样系统的权限弹窗能正常弹出,回调也能稳定接收结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:42:12