Flutter怎么使用Android原生播放器

其他教程   发布日期:2023年07月17日   浏览次数:486

这篇文章主要介绍“Flutter怎么使用Android原生播放器”,在日常操作中,相信很多人在Flutter怎么使用Android原生播放器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flutter怎么使用Android原生播放器”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

创建插件VideoViewPlugin实现FlutterPlugin:

  1. package io.flutter.plugins.videoplayer;
  2. import android.util.Log;
  3. import androidx.annotation.NonNull;
  4. import io.flutter.embedding.engine.plugins.FlutterPlugin;
  5. import io.flutter.embedding.engine.plugins.activity.ActivityAware;
  6. import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
  7. public class VideoViewPlugin implements FlutterPlugin, ActivityAware {
  8. private final static String TAG = "VideoViewPlugin";
  9. FlutterPluginBinding fpBinding;
  10. @Override
  11. public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
  12. fpBinding = binding;
  13. Log.e(TAG, "onAttachedToEngine");
  14. }
  15. @Override
  16. public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
  17. Log.e(TAG, "onDetachedFromEngine");
  18. }
  19. @Override
  20. public void onAttachedToActivity(@NonNull ActivityPluginBinding apBinding) {
  21. fpBinding.getPlatformViewRegistry().registerViewFactory("plugins.my_video_player/view", new VideoViewFactory(fpBinding, apBinding));
  22. Log.e(TAG, "onAttachedToActivity");
  23. }
  24. @Override
  25. public void onDetachedFromActivityForConfigChanges() {
  26. Log.e(TAG, "onDetachedFromActivityForConfigChanges");
  27. }
  28. @Override
  29. public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
  30. Log.e(TAG, "onReattachedToActivityForConfigChanges");
  31. }
  32. @Override
  33. public void onDetachedFromActivity() {
  34. Log.e(TAG, "onDetachedFromActivity");
  35. }
  36. }

由于引用视频播放器时需要用到Activity的context,所以实现了ActivityAware接口,在onAttachedToActivity方法中注册PlatformViewFactory!

创建VideoViewFactory实现PlatformViewFactory:

  1. package io.flutter.plugins.videoplayer;
  2. import android.content.Context;
  3. import io.flutter.Log;
  4. import io.flutter.embedding.engine.plugins.FlutterPlugin;
  5. import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
  6. import io.flutter.plugin.common.StandardMessageCodec;
  7. import io.flutter.plugin.platform.PlatformView;
  8. import io.flutter.plugin.platform.PlatformViewFactory;
  9. public class VideoViewFactory extends PlatformViewFactory {
  10. private final static String TAG = "VideoViewFactory";
  11. private final FlutterPlugin.FlutterPluginBinding fpBinding;
  12. private final ActivityPluginBinding apBinding;
  13. public VideoViewFactory(FlutterPlugin.FlutterPluginBinding fpBinding, ActivityPluginBinding apBinding) {
  14. super(StandardMessageCodec.INSTANCE);
  15. Log.e(TAG, "VideoViewFactory");
  16. this.fpBinding = fpBinding;
  17. this.apBinding = apBinding;
  18. }
  19. @Override
  20. public PlatformView create(Context context, int viewId, Object args) {
  21. Log.e(TAG, "PlatformView-create:" + args.toString());
  22. return new VideoViewPlayer(args.toString(), fpBinding, apBinding);
  23. }
  24. }

创建VideoViewPlayer,实现PlatformView和MethodChannel.MethodCallHandler:

  1. package io.flutter.plugins.videoplayer;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.util.Log;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import androidx.annotation.NonNull;
  8. import androidx.annotation.Nullable;
  9. import com.th.kjjl_flutter.R;
  10. import com.videoplayer.player.VideoView;
  11. import io.flutter.embedding.engine.plugins.FlutterPlugin;
  12. import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
  13. import io.flutter.plugin.common.MethodCall;
  14. import io.flutter.plugin.common.MethodChannel;
  15. import io.flutter.plugin.platform.PlatformView;
  16. public class VideoViewPlayer implements PlatformView, MethodChannel.MethodCallHandler {
  17. private final static String TAG = "VideoPlayerView";
  18. Activity context;
  19. private VideoView videoView;
  20. private MethodChannel methodChannel;
  21. VideoViewPlayer(String viewId, FlutterPlugin.FlutterPluginBinding fpBinding, ActivityPluginBinding apBinding) {
  22. this.context = apBinding.getActivity();
  23. videoView = (VideoView) LayoutInflater.from(context).inflate(R.layout.video_player, null);
  24. methodChannel = new MethodChannel(fpBinding.getBinaryMessenger(), "my_video_player_" + viewId);
  25. methodChannel.setMethodCallHandler(this);
  26. }
  27. @Override
  28. public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
  29. Log.e(TAG, "call.method>>" + call.method);
  30. switch (call.method) {
  31. case "setUrl":
  32. String url = call.arguments.toString();
  33. videoView.initVideoController(context);
  34. videoView.setUrl(url);
  35. break;
  36. case "start":
  37. videoView.start();
  38. break;
  39. case "pause":
  40. videoView.pause();
  41. break;
  42. case "release":
  43. videoView.pause();
  44. videoView.release();
  45. break;
  46. case "stopFullScreen":
  47. videoView.stopFullScreen();
  48. break;
  49. default:
  50. result.notImplemented();
  51. }
  52. }
  53. @Nullable
  54. @Override
  55. public View getView() {
  56. return videoView;
  57. }
  58. @Override
  59. public void dispose() {
  60. Log.e(TAG, "dispose>>");
  61. videoView.pause();
  62. videoView.release();
  63. methodChannel.setMethodCallHandler(null);
  64. methodChannel = null;
  65. }
  66. }

其中的VideoView即引用的第三方播放器库,你可以根据自己情况,使用常见的安卓端开源播放器如GSY,饺子,DKPlayer等!

video_player.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <com.videoplayer.player.VideoView xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/videoView"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent" />

在MainActivity中注册插件:

  1. class MainActivity : FlutterActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. flutterEngine!!.plugins.add(VideoViewPlugin())
  5. }
  6. }

注意:不要在GeneratedPluginRegistrant中去注册插件包括IOS,这个类由系统自动生成其它第三方插件注册代码!安卓端在MainActivity中注册,IOS端在AppDelegate中注册!

以上就是Flutter怎么使用Android原生播放器的详细内容,更多关于Flutter怎么使用Android原生播放器的资料请关注九品源码其它相关文章!