ijk_event_channel.dart 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import 'dart:async';
  2. import 'package:flutter/services.dart';
  3. import 'package:flutter_ijkplayer/src/logutil.dart';
  4. import 'package:flutter_ijkplayer/src/video_info.dart';
  5. import './ijkplayer.dart';
  6. class IJKEventChannel {
  7. int get textureId => controller?.textureId;
  8. IjkMediaController controller;
  9. IJKEventChannel(this.controller);
  10. MethodChannel channel;
  11. String get channelName => "top.kikt/ijkplayer/event/$textureId";
  12. Completer _prepareCompleter;
  13. Future<void> init() async {
  14. channel = MethodChannel(channelName);
  15. channel.setMethodCallHandler(handler);
  16. }
  17. void dispose() {
  18. channel.setMethodCallHandler(null);
  19. controller = null;
  20. }
  21. Future<dynamic> handler(MethodCall call) async {
  22. switch (call.method) {
  23. case "finish": // 播放完毕
  24. // var index = call.arguments["type"];
  25. // var type = FinishType.values[index];
  26. onPlayFinish(getInfo(call));
  27. break;
  28. case "playStateChange":
  29. onPlayStateChange(getInfo(call));
  30. break;
  31. case "prepare":
  32. onPrepare(getInfo(call));
  33. break;
  34. case "rotateChanged":
  35. onRotateChanged(call);
  36. break;
  37. default:
  38. return MissingPluginException(
  39. "$channelName ${call.method} not implement",
  40. );
  41. }
  42. return true;
  43. }
  44. VideoInfo getInfo(MethodCall call) {
  45. var map = call.arguments.cast<String, dynamic>();
  46. return VideoInfo.fromMap(map);
  47. }
  48. void onPlayFinish(VideoInfo info) {
  49. controller.isPlaying = info.isPlaying;
  50. }
  51. void onPlayStateChange(VideoInfo info) {
  52. controller.isPlaying = info.isPlaying;
  53. }
  54. void onPrepare(VideoInfo info) {
  55. controller.isPlaying = info.isPlaying;
  56. _prepareCompleter?.complete();
  57. _prepareCompleter = null;
  58. }
  59. Future<void> waitPrepare() {
  60. _prepareCompleter = Completer();
  61. return _prepareCompleter.future;
  62. }
  63. void autoPlay(IjkMediaController ijkMediaController) async {
  64. try {
  65. await waitPrepare();
  66. ijkMediaController.play();
  67. } catch (e) {
  68. LogUtils.log(e);
  69. }
  70. }
  71. void onRotateChanged(MethodCall call) {
  72. var info = getInfo(call);
  73. LogUtils.log("onRotateChanged , info = $info");
  74. }
  75. }
  76. // enum FinishType {
  77. // playEnd,
  78. // userExit,
  79. // error,
  80. // }