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

Android模拟器中PermissionsAndroid请求通知权限始终返回denied求助

解决POST_NOTIFICATIONS权限请求始终返回Denied的问题

1. 确认模拟器的Android版本

POST_NOTIFICATIONS是**Android 13(API 33)**新增的权限,在低于API 33的系统上,该权限无需动态请求(默认自动授予)。如果你的模拟器系统版本低于API 33,调用PermissionsAndroid.request请求该权限时,系统会直接返回DENIED——因为系统不识别这个权限。

解决:将模拟器切换到API 33或更高版本的Android系统镜像。

2. 检查React Native版本兼容性

旧版本React Native(如0.70以下)的PermissionsAndroid模块未内置POST_NOTIFICATIONS权限常量,且可能存在请求逻辑兼容问题:

  • 若RN版本≥0.71,建议直接使用官方提供的常量替代字符串:
const granted = await PermissionsAndroid.request(
  PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS,
  {
    title: "MyApp notifications Permission",
    message: "MyApp needs your permission to send you notifications.",
    buttonNeutral: "Ask Me Later",
    buttonNegative: "Cancel",
    buttonPositive: "OK",
  },
);
  • 若RN版本较低,需先判断系统版本再处理权限:
import { Platform } from 'react-native';

const requestNotificationPermission = async () => {
  try {
    // 仅在Android 13+(API 33)请求权限
    if (Platform.OS === 'android' && Platform.Version >= 33) {
      const granted = await PermissionsAndroid.request(
        "android.permission.POST_NOTIFICATIONS",
        {
          title: "MyApp notifications Permission",
          message: "MyApp needs your permission to send you notifications.",
          buttonNeutral: "Ask Me Later",
          buttonNegative: "Cancel",
          buttonPositive: "OK",
        },
      );

      console.log("granted", granted);
      if (granted === PermissionsAndroid.RESULTS.GRANTED) {
        dispatch({
          type: "NOTIFICATIONS_STATUS",
          value: true,
        });
      } else {
        console.log("Notifications permission denied");
      }
    } else {
      // Android 12及以下,权限默认授予
      dispatch({
        type: "NOTIFICATIONS_STATUS",
        value: true,
      });
    }
  } catch (err) {
    console.warn(err);
  }
};

3. 验证AndroidManifest.xml的权限声明

确保<uses-permission>标签放在<manifest>根标签内,而非<application>标签中:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- 正确的权限声明位置 -->
  <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
  
  <application ...>
    ...
  </application>
</manifest>

4. 明确弹窗按钮的返回逻辑

  • 点击「OK」:正常应返回PermissionsAndroid.RESULTS.GRANTED,若仍返回DENIED,请检查上述1-3步骤。
  • 点击「Ask Me Later」:返回PermissionsAndroid.RESULTS.DENIED是符合预期的,该按钮作用为暂时拒绝权限,而非授予。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:40:29