You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React Native开发模式下Android 8.0悬浮窗权限问题解决方法

解决React Native 0.42.0在Android 8.0设备上的悬浮窗权限灰屏问题

我来帮你搞定这个问题——老版本React Native在Android 8.0上的悬浮窗权限适配确实有坑,结合你的场景,原因和解决方案如下:

问题根源

Android 8.0(API级别26)对SYSTEM_ALERT_WINDOW权限的管控逻辑做了重大变更:

  1. 该权限不再属于普通危险权限,无法通过常规的权限弹窗请求,必须引导用户到应用专属的权限设置页面手动开启;
  2. 你的React Native版本(0.42.0)是2017年的老旧版本,完全没有适配Android 8.0的这个权限变更;
  3. 你之前在AndroidManifest.xml中用tools:node="remove"移除了该权限声明,导致RN开发模式的权限检测逻辑彻底失效,即使手动授予系统层面的“上层显示”权限,RN也识别不到。

具体解决方案

1. 修正AndroidManifest.xml的权限配置

把原来移除权限的代码删掉,改为正常声明SYSTEM_ALERT_WINDOW权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
          package="com.simpleoffsetpro" 
          xmlns:tools="http://schemas.android.com/tools"> 
  <!-- 移除原来的tools:node="remove"配置,替换为正常权限声明 -->
  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 
  <!-- 其他原有配置... -->
</manifest>

2. 添加Android 8.0专属的权限检测逻辑

MainActivity.java中添加代码,启动时自动检测悬浮窗权限,未授予则跳转至权限设置页面:

import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.os.Bundle;
import com.facebook.react.ReactActivity;

public class MainActivity extends ReactActivity {
    private static final int OVERLAY_PERMISSION_REQUEST_CODE = 1001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 针对Android 8.0及以上版本检测悬浮窗权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            if (!Settings.canDrawOverlays(this)) {
                // 跳转至应用权限设置页面
                Intent intent = new Intent(
                    Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName())
                );
                startActivityForResult(intent, OVERLAY_PERMISSION_REQUEST_CODE);
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == OVERLAY_PERMISSION_REQUEST_CODE) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                if (!Settings.canDrawOverlays(this)) {
                    // 如果用户还是没授予权限,可以提示后退出应用
                    finish();
                }
            }
        }
    }

    // 保留原有getMainComponentName方法
    @Override
    protected String getMainComponentName() {
        return "simpleoffsetpro";
    }
}

3. 清理缓存并重新构建项目

执行以下命令确保旧配置被清除,新代码生效:

# 清理Android端缓存
cd android && ./gradlew clean
# 重新运行应用
cd .. && react-native run-android

4. 长期建议:升级React Native版本

你的RN 0.42.0实在太老了,不仅适配问题多,还有大量已知bug和安全漏洞。如果项目允许,建议逐步升级到较新的稳定版本(比如0.60+),后续的RN版本已经原生适配了Android 8.0及以上的权限机制。不过升级时要注意同步调整依赖版本(比如native-basereact-native-vector-icons等),避免兼容性问题。

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

火山引擎 最新活动