Unity Android插件打开应用原生设置时触发ActivityNotFoundException问题解决求助
解决Unity Android插件中
ActivityNotFoundException的问题 我来帮你分析问题所在,一步步解决这个报错:
问题根源
你遇到的ActivityNotFoundException主要有两个原因:
- Intent构造方式错误:你使用的
Settings.ACTION_APPLICATION_SETTINGS搭配Uri的写法不对,系统找不到对应的处理Activity; - 多余的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
相关产品推荐
相关产品推荐

