颤抖着,如果突然拔掉耳机,我该如何注册

时间:2019-03-02 21:37:17

标签: flutter broadcastreceiver

Android java offers to register a BroadcastReceiver checking for AudioManager.ACTION_AUDIO_BECOMING_NOISY,在播放声音但拔掉头戴式耳机或断开蓝牙设备连接时,收听广播ACTION_AUDIO_BECOMING_NOISY消息的系统。

有没有一种方法可以应对这种情况,例如播放声音时拔掉耳机了吗?


有了下面答案的提示,我明白了,但是仅在调试模式下,而不是在准备发布的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 :(得分:0)

您可以使用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");
                    }
                }
        );
    }
}