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

Unity Android插件打开应用原生设置时触发ActivityNotFoundException问题解决求助

解决Unity Android插件中ActivityNotFoundException的问题

我来帮你分析问题所在,一步步解决这个报错:

问题根源

你遇到的ActivityNotFoundException主要有两个原因:

  1. Intent构造方式错误:你使用的Settings.ACTION_APPLICATION_SETTINGS搭配Uri的写法不对,系统找不到对应的处理Activity;
  2. 多余的Manifest配置:你添加的intent-filter完全没必要——我们是要启动系统自带的设置页面,不是让自己的App接收这个Intent,这个配置反而可能干扰系统的Intent解析。

另外,如果你想直接跳转到通知专属设置页(而不是通用的应用设置页),应该使用Android提供的专门Action,体验会更好。

具体修复步骤

1. 修正Java插件的openSettings方法

替换原来的Intent代码,使用适配不同Android版本的正确写法:

package com.example.plugin;
import android.app.Activity;
import android.content.Intent;
import android.provider.Settings;

public class NotificationPlugin {
    public void openSettings(Activity unityActivity) {
        String packageName = unityActivity.getPackageName();
        Intent intent = new Intent();
        
        // 适配Android 5.0+(API 21),直接跳转到通知设置页面
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
            // 传递当前App的包名,让系统定位到我们的应用通知设置
            intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName);
            // 如果你的App用了通知渠道,还可以指定渠道ID,直接跳转到对应渠道设置(可选)
            // intent.putExtra(Settings.EXTRA_CHANNEL_ID, "你的渠道ID");
        } else {
            // 旧版本Android,跳转到应用详情设置页(用户需要手动找到通知开关)
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.setData(android.net.Uri.fromParts("package", packageName, null));
        }
        
        // 添加FLAG确保在Unity环境下能正确启动Activity
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        unityActivity.startActivity(intent);
    }
}

2. 删除AndroidManifest.xml中多余的配置

把你添加的这段代码彻底删掉,它对当前需求毫无作用:

<intent-filter>
    <action android:name="android.settings.APPLICATION_SETTINGS" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

3. 优化C#调用代码(可选但推荐)

给你的C#代码加个空值检查,避免Unity环境下可能出现的空指针问题:

public static void OpenNotificationSettings() {
    AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject unityActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
    
    if (unityActivity != null) {
        const string pluginName = "com.example.plugin.NotificationPlugin";
        AndroidJavaClass pluginClass = new AndroidJavaClass(pluginName);
        pluginClass.Call("openSettings", unityActivity);
    }
}

为什么原来的代码会失败?

  • Settings.ACTION_APPLICATION_SETTINGS这个Action不需要传递Uri参数,你错误的Uri写法导致系统无法匹配到正确的系统设置Activity;
  • 多余的intent-filter会让系统误以为你的App要处理这个设置Intent,从而打乱了正常的Intent路由逻辑。

这样修改后,就能正常跳转到对应的设置页面,不会再抛出ActivityNotFoundException了。

内容的提问来源于stack exchange,提问作者T. Grumser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:17:33