【flutter】编写萤石云插件,小结

1,456 阅读2分钟

萤石云版本

implementation 'com.ezviz.sdk:ezuikit:2.2.1'

一、编程

1、初始化

//初始化EZUIKit
        EZUIKit.initWithAppKey(context.applicationContext as Application,AppKey)

        //设置授权token
        EZUIKit.setAccessToken(accessToken);

        //设置播放回调callback
        mPlayer?.setCallBack(MyCallBack(mPlayer!!))

        //设置播放参数
        mPlayer?.setUrl(playUrl);

        //开始播放
        mPlayer?.startPlay();

2、报错AccessToken异常,可能是过期或者校验失败,重新获取accessToken后可重试(转义前错误码110002)

通过查询解决,参考网址https://www.jianshu.com/p/3da73df03dc0

class MyCallBack(var mPlayer: EZUIPlayer) : EZUIPlayer.EZUIPlayerCallBack {

    override fun onPlayTime(p0: Calendar?) {
        Log.d("My","onPlayTime")
    }

    override fun onPrepared() {
        val loadView: View = mPlayer.getChildAt(mPlayer.childCount - 1)
        (loadView as? RelativeLayout)?.visibility = View.GONE
        Log.d("My","onPrepared")
    }

    override fun onVideoSizeChange(p0: Int, p1: Int) {
        Log.d("My","onVideoSizeChange")
    }

    override fun onPlayFail(p0: EZUIError?) {
        Log.d("My","onPlayFail")
    }

    override fun onPlaySuccess() {
        Log.d("My","onPlaySuccess")
    }

    override fun onPlayFinish() {
        Log.d("My","onPlayFinish")
    }
}

3、注册

android

	sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
        main.java.srcDirs += 'libs/'
        main.jniLibs.srcDirs = ['libs']
    }
     implementation 'com.ezviz.sdk:ezuikit:2.2.1'
    /*萤石SDK核心模块,必须依赖*/
    implementation 'com.ezviz.sdk:ezviz-sdk:4.12.0'

ios

s.dependency 'EZUIKit'

4、遇到的问题

创建多个实例,控制器只能控制最后一个问题

解决

1、flutter注册Widget

@override
  Widget build(BuildContext context) {
    if (defaultTargetPlatform == TargetPlatform.android) {
      return AndroidView(
        onPlatformViewCreated: _onPlatformViewCreated,
        viewType: "xxx.view",
        creationParams: <String, dynamic>{
          "key": "参数",
        },
        creationParamsCodec: const StandardMessageCodec(),
      );
    } else if (defaultTargetPlatform == TargetPlatform.iOS) {
      return UiKitView(
        viewType: "xxx.view",
        onPlatformViewCreated: _onPlatformViewCreated,
        creationParams: <String, dynamic>{
          "key": "参数",
        },
        creationParamsCodec: const StandardMessageCodec(),
      );
    } else {
      print("flutter_plugin_demo 不支持当前平台");
      return Container();
    }
  }

_onPlatformViewCreated注册控制器

void _onPlatformViewCreated(int id) {

    EzvizUIKitControl controller = EzvizUIKitControl(id,widget.callback);
    widget.ezvizUIKitViewCreatedCallback(controller);
  }

控制器注册交互和监听plugin_$id是重点,构建一个widget时,重新构建一个监听器

class EzvizUIKitControl {
  final MethodChannel _channel;
  EventCallback callback;
  EzvizUIKitControl(int id,this.callback):_channel = new MethodChannel("plugin_$id"){
    ///监听
    this.enableWatcherEzviz(id);
    this.listenerEzviz((result) {
      this.callback(result);
      return;
    });
  }
  
}  

监听

///
  void enableWatcherEzviz(int id) async {
    if (_eventSubsEzviz == null) {
      _eventSubsEzviz = EventChannel('event_$id')
          .receiveBroadcastStream()
          .listen(_eventListenerEzviz, onError: _errorListener);
    }
  }

2、android

methodChannel = MethodChannel(messenger, "plugin_$id")
        methodChannel?.setMethodCallHandler(this)
///监听
        var eventChannel = EventChannel(messenger, "event_$id")
        eventChannel?.setStreamHandler(
                object : EventChannel.StreamHandler {
                    override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
                       xxxxxxx
                    }

                    override fun onCancel(arguments: Any?) {

                    }
                }

        )

3、ios

	//注册方法
        _channel = FlutterMethodChannel(name: "plugin_"+String(viewId), binaryMessenger: registrar.messenger())
        registrar.addMethodCallDelegate(self, channel: _channel)
        //监听
        let eventChannel = FlutterEventChannel(name: "event_"+String(viewId), binaryMessenger: registrar.messenger())
        eventChannel.setStreamHandler(self)
        

二、使用

1、android

权限

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.ivy_ezviz_plugin"
    xmlns:tools="http://schemas.android.com/tools">
    <uses-permission android:name="android.permission.FLASHLIGHT"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
        tools:ignore="ProtectedPermissions"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <!--基础功能所需权限-->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!--配网所需权限-->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <!--对讲所需权限-->
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!--视频通话权限所需-->
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
</manifest>

2、ios

ios注释 # use_frameworks!

三、报错


大坑!!!!!!!!!萤石云官方的

写完代码测试完美!,提交商店失败

ITMS-90809: Deprecated API Usage - New apps that use UIWebView are no longer accepted. Instead, use WKWebView for improved security and reliability. Learn more (https://developer.apple.com/documentation/uikit/uiwebview).

问官方,回答

您好,cocoapods目前的版本是4.8.6,已不维护更新,请手动集成官网最新的版本开发集成,https://open.ys7.com/mobile/download.html?type=app

心态---崩溃!!!!!!

ios解决方法

1、下载官方sdk

https://open.ys7.com/mobile/download.html
https://open.ys7.com/mobile/download.html?type=app

2、解压后,将sdk放到自己的项目

3、配置pod

#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
# Run `pod lib lint xxx_ezviz_plugin.podspec' to validate before publishing.
#
Pod::Spec.new do |s|
  # SDK名字
  s.name             = 'xxx_ezviz_plugin'
  s.version          = '0.0.1'
  s.summary          = 'A new Flutter plugin.'
  s.description      = <<-DESC
A new Flutter plugin.
                       DESC
  s.homepage         = 'http://example.com'
  s.license          = { :file => '../LICENSE' }
  s.author           = { 'Your Company' => 'email@example.com' }
  s.source           = { :path => '.' }
  s.source_files = 'Classes/**/*'
  s.dependency 'Flutter'

  #s.subspec 'EZUIKit' do |tc|
  #      tc.dependency 'EZUIKit', '~>2.0'
  # end

  # sdk
  # s.dependency 'EZUIKit' , '~> 2.0'
  # a库
  s.vendored_library = 'Classes/Framework/**/*.a'
  # 资源文件
  s.resource = 'Classes/Framework/**/*.metallib'
  # framework库
  # s.vendored_frameworks = 'Classes/**/*.framework'

  #引用libxml2.lib和libz.lib    去掉头尾的lib
  # s.library   = "z"
  # s.libraries = "z","bz2","iconv","stdc++","stdc++.6.0.9",
  # s.frameworks = "AVFoundation","SystemConfiguration","MobileCoreServices","VideoToolbox","AudioToolbox","GLKit","CoreMedia","OpenAL"

  s.platform = :ios, '9.0'

  # Flutter.framework does not contain a i386 slice.
  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
  s.swift_version = '5.0'
end

4、插件库导入

解决方案:

s.libraries = "z","bz2","iconv","stdc++","stdc++.6.0.9",
s.frameworks = "AVFoundation","SystemConfiguration","MobileCoreServices","VideoToolbox","AudioToolbox","GLKit","CoreMedia","OpenAL"

5、由于EZUIOpenSDK太大,300+M,无法上传至gitee,只能下载后再放到插件的目录下面!!!!

总结:不懂原生,整合太麻烦,优化插件库的方法正在寻找,争取不手动添加

遇到的问题 1、新建的swift文件引用不到

处理: 1、在AS中新建文件,在xcode中引用文件

image.png 2、*.framework 本地的需要到AS中pod install一下