Flutter使用Android原生播放器詳解
接上篇:播放器-IOS(Swift)篇
安卓端原生播放器的接入思路與ios基本一致,所以本篇就不廢話了,直接上代碼:
創(chuàng)建插件VideoViewPlugin實現(xiàn)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,所以實現(xiàn)了ActivityAware接口,在onAttachedToActivity方法中注冊PlatformViewFactory!
創(chuàng)建VideoViewFactory實現(xiàn)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);
}
}
創(chuàng)建VideoViewPlayer,實現(xiàn)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即引用的第三方播放器庫,你可以根據(jù)自己情況,使用常見的安卓端開源播放器如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,這個類由系統(tǒng)自動生成其它第三方插件注冊代碼!安卓端在MainActivity中注冊,IOS端在AppDelegate中注冊!
flutter中的引用以及通信方法,上一篇已經(jīng)寫了,本篇就不再重復了!需要注意的是,插件名,插件id,methodChannel等,安卓,IOS和Flutter三端一定要一致!
到此這篇關(guān)于Flutter使用Android原生播放器詳解的文章就介紹到這了,更多相關(guān)Flutter播放器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android開發(fā)中ImageView的scaletype屬性用法分析
這篇文章主要介紹了Android開發(fā)中ImageView的scaletype屬性用法,分析了scaletype屬性參數(shù)的常見功能并結(jié)合實例形式給出了具體的使用方法,需要的朋友可以參考下2016-08-08
有關(guān)微博content的封裝實現(xiàn)詳解
本文將詳細介紹關(guān)于微博content的封裝實現(xiàn),需要的朋友可以參考下2012-11-11
解析android 流量監(jiān)測的實現(xiàn)原理
本篇文章是對android中流量監(jiān)測的實現(xiàn)原理進行了詳細的分析介紹,需要的朋友參考下2013-06-06
Android 靜默方式實現(xiàn)批量安裝卸載應用程序的深入分析
本篇文章是對Android 靜默方式實現(xiàn)批量安裝卸載應用程序進行了詳細的分析介紹,需要的朋友參考下2013-06-06

