Flutter使用Android原生播放器详解
作者:白玉梁 发布时间:2023-04-11 20:23:00
标签:Flutter,播放器,Android,原生
接上篇:播放器-IOS(Swift)篇
安卓端原生播放器的接入思路与ios基本一致,所以本篇就不废话了,直接上代码:
创建插件VideoViewPlugin实现FlutterPlugin:
package io.flutter.plugins.videoplayer;
import android.util.Log;
import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
public class VideoViewPlugin implements FlutterPlugin, ActivityAware {
private final static String TAG = "VideoViewPlugin";
FlutterPluginBinding fpBinding;
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
fpBinding = binding;
Log.e(TAG, "onAttachedToEngine");
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
Log.e(TAG, "onDetachedFromEngine");
}
@Override
public void onAttachedToActivity(@NonNull ActivityPluginBinding apBinding) {
fpBinding.getPlatformViewRegistry().registerViewFactory("plugins.my_video_player/view", new VideoViewFactory(fpBinding, apBinding));
Log.e(TAG, "onAttachedToActivity");
}
@Override
public void onDetachedFromActivityForConfigChanges() {
Log.e(TAG, "onDetachedFromActivityForConfigChanges");
}
@Override
public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
Log.e(TAG, "onReattachedToActivityForConfigChanges");
}
@Override
public void onDetachedFromActivity() {
Log.e(TAG, "onDetachedFromActivity");
}
}
由于引用视频播放器时需要用到Activity的context,所以实现了ActivityAware接口,在onAttachedToActivity方法中注册PlatformViewFactory!
创建VideoViewFactory实现PlatformViewFactory:
package io.flutter.plugins.videoplayer;
import android.content.Context;
import io.flutter.Log;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.StandardMessageCodec;
import io.flutter.plugin.platform.PlatformView;
import io.flutter.plugin.platform.PlatformViewFactory;
public class VideoViewFactory extends PlatformViewFactory {
private final static String TAG = "VideoViewFactory";
private final FlutterPlugin.FlutterPluginBinding fpBinding;
private final ActivityPluginBinding apBinding;
public VideoViewFactory(FlutterPlugin.FlutterPluginBinding fpBinding, ActivityPluginBinding apBinding) {
super(StandardMessageCodec.INSTANCE);
Log.e(TAG, "VideoViewFactory");
this.fpBinding = fpBinding;
this.apBinding = apBinding;
}
@Override
public PlatformView create(Context context, int viewId, Object args) {
Log.e(TAG, "PlatformView-create:" + args.toString());
return new VideoViewPlayer(args.toString(), fpBinding, apBinding);
}
}
创建VideoViewPlayer,实现PlatformView和MethodChannel.MethodCallHandler:
package io.flutter.plugins.videoplayer;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.th.kjjl_flutter.R;
import com.videoplayer.player.VideoView;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.platform.PlatformView;
public class VideoViewPlayer implements PlatformView, MethodChannel.MethodCallHandler {
private final static String TAG = "VideoPlayerView";
Activity context;
private VideoView videoView;
private MethodChannel methodChannel;
VideoViewPlayer(String viewId, FlutterPlugin.FlutterPluginBinding fpBinding, ActivityPluginBinding apBinding) {
this.context = apBinding.getActivity();
videoView = (VideoView) LayoutInflater.from(context).inflate(R.layout.video_player, null);
methodChannel = new MethodChannel(fpBinding.getBinaryMessenger(), "my_video_player_" + viewId);
methodChannel.setMethodCallHandler(this);
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
Log.e(TAG, "call.method>>" + call.method);
switch (call.method) {
case "setUrl":
String url = call.arguments.toString();
videoView.initVideoController(context);
videoView.setUrl(url);
break;
case "start":
videoView.start();
break;
case "pause":
videoView.pause();
break;
case "release":
videoView.pause();
videoView.release();
break;
case "stopFullScreen":
videoView.stopFullScreen();
break;
default:
result.notImplemented();
}
}
@Nullable
@Override
public View getView() {
return videoView;
}
@Override
public void dispose() {
Log.e(TAG, "dispose>>");
videoView.pause();
videoView.release();
methodChannel.setMethodCallHandler(null);
methodChannel = null;
}
}
其中的VideoView即引用的第三方播放器库,你可以根据自己情况,使用常见的安卓端开源播放器如GSY,饺子,DKPlayer等!
video_player.xml:
<?xml version="1.0" encoding="utf-8"?>
<com.videoplayer.player.VideoView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在MainActivity中注册插件:
class MainActivity : FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
flutterEngine!!.plugins.add(VideoViewPlugin())
}
}
注意:不要在GeneratedPluginRegistrant中去注册插件包括IOS,这个类由系统自动生成其它第三方插件注册代码!安卓端在MainActivity中注册,IOS端在AppDelegate中注册!
flutter中的引用以及通信方法,上一篇已经写了,本篇就不再重复了!需要注意的是,插件名,插件id,methodChannel等,安卓,IOS和Flutter三端一定要一致!
来源:https://blog.csdn.net/baiyuliang2013/article/details/129228342


猜你喜欢
- 本文实例为大家分享了Java实现图形界面计算器的具体代码,供大家参考,具体内容如下 代码:import javax.swing.*
- using System;using System.Web;using System.Web.Security;namespace Auth
- 1.什么是灰度发布?灰度发布又称金丝雀发布,是在系统升级的时候能够平滑过渡的一种发布方式。在其上可以进行A/B测试,即让一部分用户继续用产品
- 偶然间发现了Android.inputmethodservice.Keyboard类,即android可以自定义键盘类,做了一个简单例子供大
- 重要属性1、scale: 小数点后的位数。如将1.234构建为BigDecimal,scale属性则为32、RoundingMode(对照数
- 通过使用java mail来实现读取163邮箱,qq邮箱的邮件内容。1.代码实现创建springboot项目,引入依赖包<!--mai
- WPF前台代码展示<Window.Resources> <local:Source x:Key=
- 首先我们设计了模块层次图,当然图中只是给出一种实现方式,不局限于此。具体见下图。主要功能介绍如下:1)请求接口层。处理HTTP请求,及响应2
- 引言对于Nacos大家应该都不太陌生,出身阿里名声在外,能做动态服务发现、配置管理,非常好用的一个工具。然而这样的技术用的人越多面试被问的概
- 抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。下面我们以水果为例,首先定
- 我们通过项目的reimport等众多办法无法解决之后:假设这个是爆红的,因为被我已经解决了。我们进入到我们的本地仓库, 新建包。在repos
- 先新建一个文件夹kun,kun就是类所在的package。新建一个java文件。HelloWorld.java的代码如下:package k
- 本文实例为大家分享了C# Winform选项卡集成窗体的具体代码,供大家参考,具体内容如下知识要点:利用反射动态的加载窗体到对应的TabPa
- SpringMVC域对象共享数据一、域对象1. 域对象的作用就是在一定范围内可以共享数据,通常有 3 种:request: 一次请求,多个资
- 开发工具下载:Tomcat下载:wget http://learning.happymmall.com/tomcat/apache-tomc
- Spring Boot 2.x 已经发布了很久,现在 Spring Cloud 也发布了 基于 Spring Boot 2.x 的 Finc
- 前言最近测试反馈一个问题,某个查询全量信息的接口,有时候返回全量数据,符合预期,但是偶尔又只返回1条数据,简直就是“见鬼
- 1、概念:MyBatis中的延迟加载,也称为懒加载,是指在进行表的关联查询时,按照设置延迟规则推迟对关联对象的select查询。例如在进行一
- Parcelable优点:google专门为安卓写的序列化接口性能好,内存开销小,效率高,写起来复杂缺点:各个机型可能有差异,Parcela
- 在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。通常对象之间的比较可以从两个方面去看:第一个方面:对象的地址是否