美文网首页
Flutter 插件(调用原生控件--Android,集成And

Flutter 插件(调用原生控件--Android,集成And

作者: 行走世间全都是妖怪 | 来源:发表于2020-11-16 14:05 被阅读0次

    参考文档:跟我一步一步实现 Flutter 视频播放插件 (一) - 简书

以Android TextureView(查看海康监控视频)为例(Android Studio版本4.0.1,flutter版本51.0.1,Dart版本193.7543):

    1、首先是生成一个插件:

flutter create --org com.example.test --template=plugin cctv_plugin

在Android studio中右键点击项目根目录,选择flutter,选择Open Android module in Android Studio

2、生成CctvView类:

在cctvplugin的插件android/src/main/java/com.example/cctvplugin下生成CctvView类,实现PlatformView和MethodChannel.MethodCallHandler

在cctvplugin/android/libs中集成海康sdk,

在cctvplugin/android目录下的build.gradle文件中依赖海康sdk

在刚才声明的CctvView类中,声明变量:TextureView、MethodChannel、HikVideoPlayer等。

在该类中重写的方法getView()中返回声明的控件textureView

和dispose()中执行mPlayer.stopPlay()方法

生成CctvView构造方法,分别实现各声明参数的实例或初始化

要注意MethodChannel实例时的name,其中textureView实例化的方法getTextureView如下

在重写的方法onMethodCall中实现和flutter进行交互的相关方法代码,loadUrl(展示视频),stop(停止视频播放),用Handler来做结果区分和返回:

其中startRealPlay和getLastError方法分别是海康视频相关代码,这里就不贴出或者截图展示了。到这里CctvView代码就完成了。

3、生成CctvViewFactory类:

    继承PlatformViewFactory,声明BinaryMessenger,创建BinaryMessenger参数的构造方法

要注意super(StandardMessageCodec.INSTANCE);这行代码不能省略。

在重写的create方法中return 出来CctvView

4、生成CctvpluginPlugin类,实现FlutterPlugin,MethodCallHandler

依然声明MethodChannel参数,在重写方法onAttachedToEngine中实例MethodChannel,并注册CctvViewFactory

channel =new MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "cctvplugin");

channel.setMethodCallHandler(this);

flutterPluginBinding.getPlatformViewRegistry().registerViewFactory("plugins.cctv_plugin/view", new CctvViewFactory(flutterPluginBinding.getBinaryMessenger()));

其中,MethodChannel的入参BinaryMessenger通过flutterPluginBinding.getFlutterEngine().getDartExecutor()来获取,PlatformViewRegistry由flutterPluginBinding.getPlatformViewRegistry()来获取,CctvViewFactory中的BinaryMessenger由flutterPluginBinding.getBinaryMessenger()来获取。

    在重写onMethodCall方法中做了一次海康sdk的初始化

5、生成cctvplugin.dart类(flutter)

    在插件android同目录下的lib文件夹下创建cctvplugin.dart

首先声明MethodChannel,其中的name参数要和第4步CctvpluginPlugin中的name保持一致

static const MethodChannel_channel =const MethodChannel('cctvplugin');

初始化海康sdk的代码

static Futureget initHikSdk async {

final bool isInit =await _channel.invokeMethod("initHikSdk");

  return isInit;

}

同代码文件中,生成BmsVideoPlayerController类

其中init中的方法name要和第2步中的name保持一致,loadUrl和stop也和第2步中的onMethodCall保持一致。

        剩余的代码按照跟我一步一步实现 Flutter 视频播放插件 (一) - 简书来编写即可。也可根据自己的需求和需要进行相应的修改。至此,该插件就开发完成了。

6、运行demo

        编写cctv_plugin插件example/lib下的main.dart文件       

import 'package:flutter/material.dart';

import 'dart:async';

import 'package:cctvplugin/cctvplugin.dart';

void main() {

    runApp(MyApp());

}

class MyAppextends StatefulWidget {

    @override

      _MyAppStatecreateState() =>_MyAppState();

}

class _MyAppStateextends State {

    var viewPlayerController;

      @override

      void initState() {

            super.initState();

           initHikSdk();

      }

    void initHikSdk()async {

        Future isInit = Cctvplugin.initHikSdk;

        isInit.then((value) {

        if (value) {

            print("初始化成功");

        }else {

            print("初始化失败");

        }

       });

  }

    @override

  Widgetbuild(BuildContext context) {

    var x =0.0;

    var y =0.0;

    var width =400.0;

    var height = width *9.0 /16.0;

    BmsVideoPlayer videoPlayer =new BmsVideoPlayer(

        onCreated: onViewPlayerCreated,

        x: x,

        y: y,

        width: width,

        height: height);

        return MaterialApp(

            home:Scaffold(

                appBar:AppBar(

                title:const Text('Plugin example app'),),

                  body:Container(child: videoPlayer, width: width, height: height)),

            );

          }

        void onViewPlayerCreated(viewPlayerController)async{

            this.viewPlayerController = viewPlayerController;

            var result=await this.viewPlayerController.loadUrl("rtsp://112.17.101.77:554/openUrl/OgIeypq");

            print("result$result");

      }

}

7、把插件引入到项目中使用

添加如下代码

至此,就可以在flutter项目中使用cctvplugin插件了,使用方法和example/lib下的main.dart一致。

相关文章

网友评论

      本文标题:Flutter 插件(调用原生控件--Android,集成And

      本文链接:https://www.haomeiwen.com/subject/hquubktx.html