Flutter android_alarm_manager не загружает плагин flutter_audio_query для обратного вызова - PullRequest
0 голосов
/ 13 февраля 2020

Я работаю над довольно простым приложением будильника, которое использует android_alarm_manager для планирования будильника и flutter_audio_query для сбора информации о музыке c Мне нужно, чтобы все работало. Когда сработала сигнализация, мне нужно загрузить flutter_audio_query, чтобы иметь возможность доступа к путям файлов звуковых файлов, которые я хочу использовать.

Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что плагин не загружается внутри обратного вызова, вызывая MissingPluginException. Похоже, что это не проблема с плагином PathProvider (который я изначально намеревался использовать для демонстрации ниже).

Попытка MCVE (создан новый проект Flutter с поддержкой Kotlin, AndroidX под Flutter Версия 1.12.13 + hotfix.8; полный репозиторий здесь ):

main.dart:

import 'package:android_alarm_manager/android_alarm_manager.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_audio_query/flutter_audio_query.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AndroidAlarmManager.initialize();
  runApp(MyApp());
  Scheduler().setupAlarm();

  // Runs because the FAQ plugin is loaded correctly.
  final demoSongList = await FlutterAudioQuery().getSongs();
  print('Main function: ${demoSongList.length}');
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(child: Text('Sample Text', textDirection: TextDirection.ltr,));
  }
}

class Scheduler {
  setupAlarm() async {
    print('Setting up alarm!');
    final success = await AndroidAlarmManager.oneShot(Duration(seconds: 3), 42, callback);
    print(success);
  }

  static callback() async {
    // Requires FAQ plugin to be loaded which it isn't.
    final songs = await FlutterAudioQuery().getSongs();
    print('Callback ${songs.length}!');
  }
}

pubspe c .yaml

name: stack_overflow_demo
description: A Demo Application demonstrating the issue with android_alarm_manager and plugins

version: 1.0.0+1

environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  android_alarm_manager: ^0.4.5+3
  flutter_audio_query: ^0.3.3

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true

AndroidManifest. xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="io.github.geisterfurz007.stack_overflow_demo">
    <!-- io.flutter.app.FlutterApplication is an android.app.Application that
         calls FlutterMain.startInitialization(this); in its onCreate method.
         In most cases you can leave this as-is, but you if you want to provide
         additional functionality it is fine to subclass or reimplement
         FlutterApplication and put your custom class here. -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>

    <application
        android:name="io.flutter.app.FlutterApplication"
        android:label="stack_overflow_demo"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />

        <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>
    </application>
</manifest>

Если требуется больше файлов, дайте мне знать; Я добавлю их, как только смогу!
Исходя из моего понимания с Android Embedded V2 (как объявлено в AndroidManifest. xml), все плагины должны быть загружены посредством отражения и создания моего собственного приложения для загрузки плагинов. не должно быть обязательным.

Теперь к актуальному вопросу этого вопроса: что заставляет плагин FlutterAudioQuery не загружаться в обратный вызов и как я могу изменить это, чтобы я мог использовать его при срабатывании тревоги?

Для прозрачности: после довольно низких просмотров по этому вопросу через день я решил открыть выпуск Github в репозитории флаттера здесь .

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Доступна новая версия audio_query_plugin, и, похоже, работает новый API встраивания Flutter V2.

By CHANGELOG.md

0 голосов
/ 21 февраля 2020

Я думаю, что проблема в том, что flutter_audio_query еще не поддерживает новые API плагинов. Проверьте эту страницу в документации по флаттеру.

Я быстро взглянул на источник flutter_audio_query, и он, похоже, не реализует интерфейс FlutterPlugin (шаг обновления 1 в документации).

...