Я наконец-то исправил эту проблему сам, после нескольких часов борьбы (но чувствовал себя намного дольше!).Прорыв произошел, когда я фактически клонировал репозиторий Flutter Plugins Github , который содержит android_alarm_manager
, и изучил пример кода и посмотрел, как он был выложен в IDE, а не смотрел на изолированные файлы в Интернете.
В файле Readme не очень ясно, что именно делать, если вы не разбираетесь в разработке Android Java, но становится ясно, когда вы посмотрите на рабочий пример кода.
Вам нужночтобы вставить файл Application.java
, который вам дают в каталоге с примером, в ваш реальный проект, в ту же папку, что и существующий файл MainActivity.java
.Содержимое должно выглядеть так:
package io.flutter.plugins.androidalarmmanagerexample;
import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugins.androidalarmmanager.AlarmService;
public class Application extends FlutterApplication implements PluginRegistrantCallback {
@Override
public void onCreate() {
super.onCreate();
AlarmService.setPluginRegistrant(this);
}
@Override
public void registerWith(PluginRegistry registry) {
GeneratedPluginRegistrant.registerWith(registry);
}
}
Что касается того, куда вам нужно поместить этот файл, их пример выглядит так, но ваш, вероятно, находится в чем-то вроде <your project dir>/android/app/src/main/java/com/example/<your project name>
:
После этого вы должны обновить имя пакета в первой строке Application.java
с package io.flutter.plugins.androidalarmmanagerexample;
, чтобы соответствовать пакету, используемому вашим проектом.(см. первую строку вашего существующего MainActivity.java
).Если вы этого не сделаете, Gradle не найдет его и ничего не работает!
Теперь вы можете следовать совету в Readme , добавив разрешения и т. Д .:
После обычного импорта этого плагина в свой проект добавьте следующее к своему AndroidManifest.xml
в тегах <manifest></manifest>
:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
Далее, в пределах<application></application>
тегов, добавьте:
<service
android:name="io.flutter.plugins.androidalarmmanager.AlarmService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false"/>
<receiver
android:name="io.flutter.plugins.androidalarmmanager.AlarmBroadcastReceiver"
android:exported="false"/>
<receiver
android:name="io.flutter.plugins.androidalarmmanager.RebootBroadcastReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
Последняя часть - часть, которая меня больше всего смутила.Звучит так, будто они очень расплывчаты, но если вы сделали все остальное точно раньше, это именно то, что вам нужно сделать.
Что должно быть отражено в AndroidManifest.xml приложения.Например:
<application
android:name=".Application"
...
Просто измените ваш android:name
на .Application
, что означает, что теперь он будет использовать Application.java
, который мы добавили ранее.
Вот и все!Надеюсь, теперь вы можете запустить свое приложение.