В флаттере как зарегистрироваться если гарнитура внезапно отключена - PullRequest
0 голосов
/ 03 марта 2019

Android java предлагает зарегистрировать BroadcastReceiver, проверяющий AudioManager.ACTION_AUDIO_BECOMING_NOISY , для прослушивания системы, передающей сообщение ACTION_AUDIO_BECOMING_NOISY, когда воспроизводится звук, но затем гарнитура отключается или устройство Bluetooth отключается.

Есть ли способ сделать это во флаттере, чтобы отреагировать на событие, например, при отключении гарнитуры во время воспроизведения звука?


С подсказкой в ​​ответе ниже я получилэто происходит, но только в режиме отладки, а не в готовом к выпуску APK.Вот что я сделал:

Java:

public class MainActivity extends FlutterActivity {
  public static final String STREAM = "XXX";
  public static String TAG = "player/java file";
  private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
  private BecomingNoisyReceiver myNoisyAudioStreamReceiver = null;


  private class BecomingNoisyReceiver extends BroadcastReceiver {
final EventChannel.EventSink eventSink;

BecomingNoisyReceiver(EventChannel.EventSink eventSink){
  super();
  this.eventSink = eventSink;
}

@Override
public void onReceive(Context context, Intent intent) {
  if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
    Log.w(TAG, "Noisy Receiver activated");
    eventSink.success("success");

  }
}
}

   @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  GeneratedPluginRegistrant.registerWith(this);

  new EventChannel(getFlutterView(), STREAM).setStreamHandler(
          new EventChannel.StreamHandler() {
              @Override
              public void onListen(Object args, final EventChannel.EventSink events) {
                  Log.w(TAG, "adding listener");
                  myNoisyAudioStreamReceiver = new BecomingNoisyReceiver(events);
                  registerReceiver(myNoisyAudioStreamReceiver, intentFilter);
              }

              @Override
              public void onCancel(Object args) {
                  Log.w(TAG, "cancelling listener");
                  unregisterReceiver(myNoisyAudioStreamReceiver);
              }
          }
  );
  }  
}

И в Dart, в расширении класса State:

static const platform = const EventChannel('XXX'); 
StreamSubscription _noisySubscription;

в initState ():

 _noisySubscription = null;

Всякий раз, когда мне это нужно:

if(_noisySubscription == null){
    _noisySubscription = platform.receiveBroadcastStream().listen(_handleNoisy);
      }

Всякий раз, когда это нужно остановить:

_noisySubscription.cancel().then((_){_noisySubscription = null;});

Любой намек, как решить эту проблему?

1 Ответ

0 голосов
/ 03 марта 2019

Вы можете использовать EventChannel , чтобы сообщить о событии в нативной части (Android) в часть Dart.Ссылка: https://medium.com/@svenasse/flutter-event-channels-89623ce6c017

(псевдо) Пример кода (он не находится в состоянии выполнения, но, надеюсь, он дает вам представление):

Часть дротика


void _handleNoisy(noisyEvent) {
  debugPrint("noisyEvent $noisyEvent");
}

static const stream =
    const EventChannel('com.yourcompany.yourapp/ACTION_AUDIO_BECOMING_NOISY');

StreamSubscription _noisySubscription = stream.receiveBroadcastStream().listen(_handleNoisy);

Часть Java

public class MainActivity extends FlutterActivity {
    public static final String STREAM = "com.yourcompany.yourapp/ACTION_AUDIO_BECOMING_NOISY";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new EventChannel(getFlutterView(), STREAM).setStreamHandler(
                new EventChannel.StreamHandler() {
                    @Override
                    public void onListen(Object args, final EventChannel.EventSink dartEvents) {

                        Log.w(TAG, "adding listener");
                        noisyEvent = ... // Register
                        private class BecomingNoisyReceiver extends BroadcastReceiver {
                          @Override
                          public void onReceive(Context context, Intent intent) {
                            if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
                              dartEvents.success("the payload you want to pass to dart")
                            }
                          }
                      }
                    }

                    @Override
                    public void onCancel(Object args) {
                        Log.w(TAG, "cancelling listener");
                    }
                }
        );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...