颤振应用程序BOOT_COMPLETED接收器不起作用



以前有很多这样的问题,我试图实现这些答案,但它在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上实现呢?。如何在颤振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

已解决

在我导入2行代码后,错误消失了

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

并且不要忘记初始化CCD_ 4。现在,我的应用程序在Android 11上启动完成后自动运行。

对于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

从Android 10(API 29(开始,为了最大限度地减少用户干扰,对直接从后台启动活动有限制。如果您使用API 28或更低版本,请查看您的应用程序是否在启动时启动。作为一种可能的折衷方案,你可以显示一个高优先级的通知,当用户点击它时,它会打开应用程序

相关内容

最新更新