【问题标题】:Flutter app BOOT_COMPLETED receiver doesn't workFlutter 应用程序 BOOT_COMPLETED 接收器不起作用
【发布时间】:2022-01-21 03:10:37
【问题描述】:

以前有很多这样的问题,我已经尝试实现答案,但它在 Android 11 上不起作用。我希望我的 Flutter 应用程序在启动完成后自动启动/打开。

这是我的接收者MainActivityReceiver.kt

package com.mypackage

import android.content.BroadcastReceiver
import android.content.Context;
import android.content.Intent;

class MainActivityReceiver: BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
            val i = Intent(context, MainActivity::class.java)
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            context.startActivity(i)
        }
    }
}

我在AndroidManifest.xml上添加了一些代码

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<receiver
            android:enabled="true"
            android:exported="true"
            android:name="com.myPackage.MainActivityReceiver"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

  </receiver>

编辑

我找到了https://stackoverflow.com/a/63250729/11445944,但是如何在flutter上实现呢? 如何在flutter上添加这段代码MainActivity.kt

if (!Settings.canDrawOverlays(getApplicationContext())) {
            Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
            Uri uri = Uri.fromParts("package", getPackageName(), null);

            myIntent.setData(uri);
            startActivityForResult(myIntent, REQUEST_OVERLAY_PERMISSIONS);
            return;
        }

我已将它添加到我的 MainActivity.kt

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (!Settings.canDrawOverlays(getApplicationContext())) {
            val myIntent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
            val uri: Uri = Uri.fromParts("package", getPackageName(), null)
            myIntent.setData(uri)
            startActivityForResult(myIntent, REQUEST_OVERLAY_PERMISSIONS)
            return
        }
    }

我在构建时遇到错误

[   +2 ms] e: project_path/app/MainActivity.kt: (32, 5): 'onCreate' overrides nothing
[  +24 ms] e: project_path/app/src/main/kotlin/package/MainActivity.kt: (32, 47): Unresolved reference: Bundle
[   +7 ms] e: project_path/app/src/main/kotlin/package/MainActivity.kt: (34, 14): Unresolved reference: Settings
[   +3 ms] e: project_path/app/src/main/kotlin/package/MainActivity.kt: (35, 35): Unresolved reference: Settings
[   +3 ms] e: project_path/app/src/main/kotlin/MainActivity.kt: (38, 46): Unresolved reference:
REQUEST_OVERLAY_PERMISSIONS

已解决

导入两行代码后错误消失了

import android.os.Bundle
import android.provider.Settings

别忘了初始化var REQUEST_OVERLAY_PERMISSIONS = 100。现在我的应用在 Android 11 上启动完成后会自动运行。

【问题讨论】:

    标签: android flutter


    【解决方案1】:

    对于 Flutter,您需要在清单文件中添加:

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

    然后创建MainActivity.kt文件

     if (!Settings.canDrawOverlays(getApplicationContext())) {
                val myIntent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
                val uri: Uri = Uri.fromParts("package", getPackageName(), null)
                myIntent.setData(uri)
                startActivityForResult(myIntent, REQUEST_OVERLAY_PERMISSIONS)
                return
            }
    

    接收器的其余部分相同。

    编辑.....

    对于 Android - 11 项更改。 您需要打开该系统覆盖权限的设置:

    startActivityForResult(
        Intent(
            Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
            Uri.parse("package:$packageName")
        ),
        REQUEST_OVERDRAW_PERMISSION_CODE
    )
    

    看看这个:https://developer.android.com/about/versions/11/privacy/permissions#manage_overlay

    【讨论】:

    • 我尝试添加该代码,但出现错误。请参阅上面的编辑。
    • @MiftakhulArzak :你得到同样的错误吗?
    • 是的,我得到了同样的错误。构建时发生错误,
    • @MiftakhulArzak :检查我编辑的答案。希望这会帮助你。请卸载旧应用并尝试安装新应用并进行flutter clean并再次检查
    • 谢谢,您的回答与我在编辑中的代码相同,我之前尝试过但出现错误。在我添加一些像这样stackoverflow.com/a/70980466/11445944 的导入代码后,错误就消失了
    【解决方案2】:

    从 Android 10 (API 29) 开始,有restrictions 可以直接从后台启动活动,以尽量减少用户中断。如果您使用 API 28 或更低版本,请查看您的应用程序是否在启动时启动。作为一种可能的折衷方案,您可以显示一个高优先级通知,当用户单击它时会打开应用程序。

    【讨论】:

    • 我找到了stackoverflow.com/a/63250729/11445944,但是如何在flutter上实现呢?它适用于安卓 10。
    • 你必须实现一个BroadcastReceiver,它会在手机启动时接收。在接收方的onReceive 方法中,将您当前拥有的代码放入您的onCreate 方法中。
    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多