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

.NET MAUI Android应用小米设备重启自启动问题:清单错误与INSTALL_FAILED_USER_RESTRICTED解决方法问询

.NET MAUI Android应用小米设备重启自启动问题:清单错误与INSTALL_FAILED_USER_RESTRICTED解决方法问询

嘿,我之前在小米设备上折腾过.NET MAUI的自启动功能,踩过和你几乎一模一样的坑,咱们一步步把问题拆解解决,最后给你一个能跑的完整示例:

一、先解决AndroidManifest.xml的编译错误

你之前手动加<receiver><intent-filter>时报错,核心原因是标签位置放错了

  • <receiver>必须嵌套在<application>标签内部,不能直接放在<manifest>下面
  • <intent-filter>必须嵌套在<receiver>内部,不能直接放在<application>

不过在.NET MAUI里,更推荐用C#特性来注册广播接收器,这样能避免手动修改清单的冲突问题,MAUI会自动帮你合并正确的清单内容,完全不用手动写这些标签。

二、解决INSTALL_FAILED_USER_RESTRICTED错误

这个错误本质是小米MIUI的安全限制在搞鬼,哪怕你关了MIUI优化,还需要做这几件事:

  1. 手动授予自启动权限(最关键)
    打开小米设备的「设置」→「应用设置」→「应用管理」→找到你的应用→「权限管理」→「自启动权限」→直接拉满开启。小米的自启动权限是独立于系统权限的,默认全关,哪怕你加了RECEIVE_BOOT_COMPLETED权限也没用。
  2. 调试/安装权限配置
    • 开发者选项里开启「允许USB安装应用」和「保持ADB调试授权」,这样重启后不会重置ADB的调试权限
    • 测试自启动一定要用发布模式的APK,调试模式下重启后ADB会断开,而且MIUI对调试应用的限制多到离谱
  3. 安装APK的注意事项
    发布版APK安装时,要允许「未知来源应用安装」,安装完成后务必去权限里确认自启动权限已经打开

三、完整可运行的BootReceiver + 日志示例

我给你写一个能直接用的示例,包含广播接收器和MainActivity的日志打印,方便你验证自启动是否成功:

1. 编写BootReceiver.cs(放在Platforms/Android目录下)

using Android.App;
using Android.Content;
using Android.Util;

namespace YourAppName.Platforms.Android;

[BroadcastReceiver(Enabled = true, Exported = true)]
[IntentFilter(new[] 
{ 
    Intent.ActionBootCompleted, 
    "android.intent.action.QUICKBOOT_POWERON" // 小米等国产ROM快速重启需要这个额外的action
})]
public class BootReceiver : BroadcastReceiver
{
    private const string Tag = "BootReceiver";

    public override void OnReceive(Context? context, Intent? intent)
    {
        if (intent == null || context == null) return;

        // 打印日志,后续用adb logcat就能看到
        Log.Info(Tag, "设备重启完成,触发自启动广播");

        // 启动主Activity,必须加NewTask Flag,否则后台无法启动Activity
        var mainIntent = new Intent(context, typeof(MainActivity));
        mainIntent.AddFlags(ActivityFlags.NewTask);
        context.StartActivity(mainIntent);
    }
}

2. 配置AndroidManifest.xml(Platforms/Android/AndroidManifest.xml

确保你已经添加了RECEIVE_BOOT_COMPLETED权限,注意权限要放在<manifest>标签下、<application>标签外面:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true">
        <!-- 这里不用手动加<receiver>,C#特性会自动帮你合并到清单里! -->
    </application>
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
</manifest>

3. 在MainActivity里添加启动日志(验证自启动是否成功)

修改Platforms/Android/MainActivity.cs,在OnCreate里加日志:

using Android.App;
using Android.Content.PM;
using Android.OS;
using Android.Util;

namespace YourAppName.Platforms.Android;

[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
    private const string Tag = "MainActivity";

    protected override void OnCreate(Bundle? savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Log.Info(Tag, "应用启动,当前启动来源:" + (Intent?.Action ?? "未知"));
        
        // 判断是否是重启自启动触发的
        if (Intent?.Action == Intent.ActionBootCompleted || Intent?.Action == "android.intent.action.QUICKBOOT_POWERON")
        {
            Log.Info(Tag, "应用通过设备重启自启动成功!");
        }
    }
}

四、测试步骤(按顺序来别乱)

  1. 生成发布版APK:在Visual Studio里选「Release」配置,右键项目→「Archive」,然后生成并导出APK
  2. 把APK传到小米设备,手动安装(允许未知来源)
  3. 去应用权限里确认「自启动权限」已经开启
  4. 重启设备
  5. 重启完成后,打开命令行输入adb logcat -s BootReceiver MainActivity,就能看到自启动的日志了

最后再强调几个注意点

  • 小米的自启动权限是硬门槛,没有任何代码能绕过,必须手动开
  • 绝对不要同时用C#特性和手动修改清单的方式注册广播,会导致冲突
  • 除了ACTION_BOOT_COMPLETED,加上QUICKBOOT_POWERON能覆盖小米的快速重启场景
  • 测试一定要用发布版APK,调试版的限制太多,完全测不出真实效果

如果还有问题,你可以把logcat的日志贴出来,我再帮你排查!

火山引擎 最新活动