dart 在 Boot _COMPLETED上自动启动,用于基于Android的Flutter应用程序示例不起作用

piztneat  于 2023-06-27  发布在  Android
关注(0)|答案(3)|浏览(116)

有很多使用 Boot _COMPLETED在设备引导时启动应用程序的例子。我尝试在我的Flutter应用程序中使用这些示例。让它启动应用程序。这是一个简单的标牌应用程序,显示图像。基本上类似于相框。
在下面的示例代码中,应用程序正在编译,但是,例如,当我重新启动模拟器时,代码似乎没有任何效果。
我的猜测是,我没有调用正确的代码来实际启动应用程序。我不是一个Android开发者,所以我有问题,弄清楚到底是怎么回事。清单如下。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="au.net.digitall.cmplayer">

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application
    android:name="io.flutter.app.FlutterApplication"
    android:label="cm_player"
    android:icon="@mipmap/ic_launcher"
    tools:ignore="GoogleAppIndexingWarning">
    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/cmTheme2"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">
        
        <meta-data
            android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
            android:value="true" />
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <receiver
        android:enabled="true"
        android:name=".StartCmPlayerServiceAtBootReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
</application>

然后使用StartCmPlayerServiceAtBootReceiver类启动APP。

package au.net.digitall.cmplayer;

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

public class StartCmPlayerServiceAtBootReceiver extends BroadcastReceiver {

    private static final String TAG = StartCmPlayerServiceAtBootReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "BOOT detected");
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent serviceIntent = new Intent(context, MainActivity.class);
            context.startService(serviceIntent);
        }
    }
}

这一切都编译和运行,但在重新启动时什么也没发生。感谢帮助。

laik7k3q

laik7k3q1#

非常感谢Mike M。他的建议和指出其他基于Android的讨论给了我足够的信息来存档autostart Boot 时。对上面示例的代码更改如下。
在StartCmPlayerServiceAtBootReceiver类中,更改为

public void onReceive(Context context, Intent intent) {
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
        Intent mIntent = new Intent(context, MainActivity.class);
        mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(mIntent);
    }
}

再次感谢,我希望其他flutter开发人员发现这是有用的。

omhiaaxx

omhiaaxx2#

1.在kotlin路径project_name/android/app/src/main/kotlin/com/example/app/上创建接收器类

package com.example.app

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

class BootReceiver: 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)
        }
    }
}

1.在清单上添加权限

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

1.在清单上的应用程序标签内添加接收器标签

<receiver
            android:enabled="true"
            android:exported="true"
            android:name="com.example.app.BootReceiver"
            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>

1.添加代码以在MainActivity.kt上完成启动后打开应用程序,您可以在project_name/android/app/src/main/kotlin/com/example/app/上找到它

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        var REQUEST_OVERLAY_PERMISSIONS = 100
        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
        }
    }

不要忘记在MainActivity.kt上导入下面的代码,因为你需要BundleSettings

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

在我的flutter应用程序上工作,在android11上测试。

pexxcrt2

pexxcrt23#

@Miftakhul Arzak你的答案工程完美的Android即使在中国OEM的像OPPO和Vivo甚至在Android 13。谢谢你,这是一个生命拯救者。
如果有人正在研究java,并且想用java完成上面的代码::
AndroidManifest.xml::-

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

<receiver
 android:enabled="true"
 android:exported="true"
 android:name=".autostart"           
 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>

MainActivity.java :-

if(!Settings.canDrawOverlays(getApplicationContext())){
 Intent i=new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
 Uri uri=Uri.fromParts("package",getPackageName(),null);
 i.setData(uri);
 startActivityForResult(i,7);
}

Broadcast Receiver::-

public class autostart extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
   Intent mIntent = new Intent(context, MainActivity.class);
   mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   context.startActivity(mIntent);
  }
 }
}

你唯一需要的是自动发射许可。

相关问题