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實現(xiàn)EventBus登錄界面與傳值(粘性事件)
這篇文章主要為大家詳細介紹了Android實現(xiàn)EventBus登錄界面與傳值,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11Android開發(fā)之ViewSwitcher用法實例
這篇文章主要介紹了Android開發(fā)之ViewSwitcher用法,結(jié)合實例形式分析了ViewSwitcher的功能、使用方法與相關(guān)注意事項,需要的朋友可以參考下2016-02-02Android應(yīng)用開發(fā)中WebView的常用方法筆記整理
WebView即是在安卓本地應(yīng)用中打開網(wǎng)頁視圖功能,其中對于JavaScript加載的各項操作是重點和難點,本文就為大家送上Android應(yīng)用開發(fā)中WebView的常用方法筆記整理2016-05-05超簡單實現(xiàn)Android自定義Toast示例(附源碼)
本篇文章主要介紹了超簡單實現(xiàn)Android自定義Toast示例(附源碼),具有一定的參考價值,有興趣的可以了解一下。2017-02-02