更新记录

1.1.0(2022-01-04)

新增离线配置wifi

1.0.0(2021-12-23)

发布新版本


平台兼容性

Android Android CPU类型 iOS
适用版本区间:5.0 - 11.0 armeabi-v7a:未测试,arm64-v8a:支持,x86:未测试 ×

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


插件使用说明

  • 插件申请权限

    • 麦克风权限(可参考示例项目)
    • 网络请求权限
    • 摄像头权限
  • 需要在manifest.json文件中开启以下权限

    /* android打包配置 */
            "android" : {
                "permissions" : [
                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
                    "<uses-permission android:name=\"android.permission.USE_CREDENTIALS\"/>",
                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                ],
                "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ]
            },
  • 使用本插件需要用到permission.js并在App.vue页面中开启(示例文件中包含权限文件),App.vue内容如下:

    <script>
  import permision from "utils/permission.js"
    export default {
        onLaunch: function() {
            console.log('App Launch')
      // 开启语音权限
      this.requestAndroidPermission("android.permission.RECORD_AUDIO");
        },
        onShow: function() {
            console.log('App Show')
        },
        onHide: function() {
            console.log('App Hide')
        },
    methods:{
      async requestAndroidPermission(permisionID) {
        var result = await permision.requestAndroidPermission(permisionID)
        var strStatus = "";
        if (result == 1) {
          strStatus = "已获得授权"
          this.initSDK();
        } else if (result == 0) {
          strStatus = "未获得授权"
        } else {
          strStatus = "被永久拒绝权限"
        }
      },
    }
    }
</script>

<style>
    /*每个页面公共css */
</style>
  • index.nvue页面内容如下
<template>
  <view class="content">
    <leven-lechengSubVideoPlay ref="refLeCheng" v-if="initSdkSuccess" :config="config"
      style="height: 500rpx; width: 750rpx;" @onError="onError" @onPlayResult="onPlayResult" @onOpenTalk="onOpenTalk"
      @onCloseTalk="onCloseTalk">
    </leven-lechengSubVideoPlay>
    <view class="button" style="width: 750rpx; margin-bottom: 20rpx;">
      <button @click="openTalk" style="flex: 1;">开启对讲</button>
      <button @click="closeTalk">关闭对讲</button>
      <button @click="closePlayer">销毁播放器资源</button>
    </view>
    <!-- 控制按钮 -->
    <view class="controll-button-box">
      <view class="controll-button-box-inner"></view>
      <!-- 三角形按钮 -->
      <view class="sanjiao-image top" @touchstart="controlPtz('up')" @touchend="controlPtz('stop')">
        <image class="sanjiao-image-body" src="/static/images/icon-sanjiao-top.png"></image>
      </view>
      <view class="sanjiao-image left" @touchstart="controlPtz('left')" @touchend="controlPtz('stop')">
        <image class="sanjiao-image-body" src="/static/images/icon-sanjiao-left.png"></image>
      </view>
      <view class="sanjiao-image bottom" @touchstart="controlPtz('down')" @touchend="controlPtz('stop')">
        <image class="sanjiao-image-body" src="/static/images/icon-sanjiao-bottom.png"></image>
      </view>
      <view class="sanjiao-image right" @touchstart="controlPtz('right')" @touchend="controlPtz('stop')">
        <image class="sanjiao-image-body" src="/static/images/icon-sanjiao-right.png"></image>
      </view>
    </view>
  </view>
</template>

<script>
  const videoPlayPlugin = uni.requireNativePlugin('leven-lechengsubaccount-leChengSubModule')
  export default {
    data() {
      return {
        title: 'Hello',
        config: {
          deviceId: ""
        },
        initSdkSuccess: false
      }
    },
    onLoad() {

    },
    onReady() {
      // this.$refs.refLeCheng.initData();
      // 初始化sdk
      this.initSdk();
    },
    methods: {
      // 初始化sdk
      initSdk() {
        videoPlayPlugin.initSdk({
          url: "https://openapi.lechange.cn:443",
          appId: "",
          appSecret: ""
        }, (res) => {
          if (res.code == 0) {
            // 初始化成功
            this.initSdkSuccess = true;
            uni.showToast({
              icon: "none",
              title: "初始化成功"
            })

            // 登录子账户
            // this.loginSubAccount();
          } else {
            uni.showToast({
              icon: "none",
              title: JSON.stringify(res.message)
            })
          }
        })
      },
      // 登录子账户
      loginSubAccount() {
        videoPlayPlugin.loginSubAccount({
          subAccount: "15911111111"
        }, res => {});
      },
      // 失败
      onError(data) {
        uni.showToast({
          icon: "none",
          title: JSON.stringify(data.detail)
        })
      },
      // 播放状态
      onPlayResult(data) {
        // uni.showToast({
        //   icon: "none",
        //   title: JSON.stringify(data)
        // })
        if (data.detail == "success") {
          uni.showToast({
            icon: "none",
            title: "播放成功"
          })
        } else {
          uni.showToast({
            icon: "none",
            title: "播放失败"
          })
        }
      },
      // 开启对讲
      openTalk() {
        this.$refs.refLeCheng.openTalk();
      },
      // 开启对讲结果
      onOpenTalk(data) {
        if (data.detail == "success") {
          uni.showToast({
            icon: "none",
            title: "开启对讲成功"
          })
        } else {
          uni.showToast({
            icon: "none",
            title: "开启对讲失败"
          })
        }
      },
      // 关闭对讲
      closeTalk() {
        this.$refs.refLeCheng.closeTalk();
      },
      // 关闭对讲结果
      onCloseTalk(data) {
        if (data.detail == "success") {
          uni.showToast({
            icon: "none",
            title: "关闭对讲成功"
          })
        } else {
          uni.showToast({
            icon: "none",
            title: "关闭对讲失败"
          })
        }
      },
      // 云台控制
      controlPtz(type) {
        switch (type) {
          case "up":
            this.$refs.refLeCheng.ptzUp();
            break;
          case "down":
            this.$refs.refLeCheng.ptzDown();
            break;
          case "left":
            this.$refs.refLeCheng.ptzLeft();
            break;
          case "right":
            this.$refs.refLeCheng.ptzRight();
            break;
          default:
            this.$refs.refLeCheng.ptzStop();
        }
      },
      // 销毁播放资源
      closePlayer() {
        this.initSdkSuccess = false;
        this.$refs.refLeCheng.destroyPlayer();
      }
    }
  }
</script>

<style scoped>
  .content {
    flex-direction: column;
    align-items: center;
  }

  .controll-button-box {
    width: 400rpx;
    height: 400rpx;
    border-radius: 200rpx;
    border: 1px solid #13227a;
    background-color: #FFFFFF;
    justify-content: center;
    align-items: center;
    position: relative;
  }

  .controll-button-box-inner {
    width: 200rpx;
    height: 200rpx;
    border-radius: 100rpx;
    border: 1px solid #13227a;
    background-color: #F9F9F9;
  }

  .sanjiao-image {
    position: absolute;
  }

  .top {
    top: 0;
  }

  .left {
    left: 0;
  }

  .bottom {
    bottom: 0;
  }

  .right {
    right: 0;
  }

  .sanjiao-image-body {
    width: 100rpx;
    height: 100rpx;
  }
</style>
  • 可下载示例文件,sdk的appId和appSecret以及播放视频的设备id需要用自己的数据
  • 购买插件前请先试用,试用通过再购买。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

麦克风权限 网络请求权限 摄像头权限 wifi状态权限

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据 SDK地址:https://open.imoulife.com/book/zh/readme/upload.html

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问