溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Flutter怎么使用Android原生播放器

發(fā)布時(shí)間:2023-02-28 14:48:10 來源:億速云 閱讀:171 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Flutter怎么使用Android原生播放器”,在日常操作中,相信很多人在Flutter怎么使用Android原生播放器問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Flutter怎么使用Android原生播放器”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

創(chuàng)建插件VideoViewPlugin實(shí)現(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");
    }
}

由于引用視頻播放器時(shí)需要用到Activity的context,所以實(shí)現(xiàn)了ActivityAware接口,在onAttachedToActivity方法中注冊(cè)PlatformViewFactory!

創(chuàng)建VideoViewFactory實(shí)現(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,實(shí)現(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中注冊(cè)插件:

class MainActivity : FlutterActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        flutterEngine!!.plugins.add(VideoViewPlugin())
    }
}

注意:不要在GeneratedPluginRegistrant中去注冊(cè)插件包括IOS,這個(gè)類由系統(tǒng)自動(dòng)生成其它第三方插件注冊(cè)代碼!安卓端在MainActivity中注冊(cè),IOS端在AppDelegate中注冊(cè)!

到此,關(guān)于“Flutter怎么使用Android原生播放器”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI