iOS

# 快速集成

Juphoonn 视频客服除了提供 Android SDK 与 iOS SDK 之外,也提供主流的开发平台及工具集成插件、示例。

可灵活适配 Android 、iOS、Windows 终端。只需调用几个接口,几行代码即可拥有视频通话能力。另外还支持对接行内通知管理平台等,业务集成更加灵活。

本文为您介绍了 Android 端集成 Plugin 的操作步骤,帮助您快速集成 Plugin 并实现音视频通话(访客侧)的基本功能。

# 概览

如果你是第一次使用菊风视频能力平台的服务,我们推荐观看下面的视频,了解关于菊风服务的基本信息以及如何快速集成示例项目。

# 1. 开发环境要求

  • Android SDK API 等级 21 或以上

  • Android Studio 3.5及以上版本

  • 支持 Android 5.0 或以上版本的移动设备(非AndroidX)

    TIP

    注:我们提供的 aar 库都是依赖 Android Support 库的,如果您的工程需要用AndroidX集成,可以通过 Google 官网提供的独立工具 Jetifier (opens new window) 将依赖于Android Support 的库迁移为依赖于等效的 AndroidX 软件包。

# 2. 下载Juphoon_Rtc_Plugin库

通过下面链接下载最新的集成插件包,并解压其中Juphoon_Rtc_Plugin_for_Android_vXXX_CallCenter文件,解压后Plugin文件如下图所示

img

# 3. 项目配置

# 步骤一:导入库

在工程目录新建存放aar的目录,将JCCGuestPlugin.aar、JRTCDoodlePlugin.aar、JRTCSSL.aar、JRTCKit.aar和JRTCSDK.aar文件拷入

repositories {
    flatDir {
        dirs '../libs'
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation(name:'JRTCSDK', ext: 'aar')
    implementation(name: 'JRTCKit', ext: 'aar')
    implementation(name:'JRTCDoodlePlugin', ext: 'aar')
    implementation(name: 'JRTCSSL', ext: 'aar')
    implementation(name:'JCCGuestPlugin', ext: 'aar')
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'android.arch.lifecycle:livedata:1.1.1'
    implementation 'android.arch.lifecycle:viewmodel:1.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
}repositories {
    flatDir {
        dirs '../libs'
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation(name:'JRTCSDK', ext: 'aar')
    implementation(name: 'JRTCKit', ext: 'aar')
    implementation(name:'JRTCDoodlePlugin', ext: 'aar')
    implementation(name: 'JRTCSSL', ext: 'aar')
    implementation(name:'JCCGuestPlugin', ext: 'aar')
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'android.arch.lifecycle:livedata:1.1.1'
    implementation 'android.arch.lifecycle:viewmodel:1.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
}

# 步骤二:权限配置

根据项目需要,打开 AndroidManifest.xml 文件,配置如下权限

<!-- 摄像头权限 -->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature
	android:name="android.hardware.bluetooth"
	android:required="false" />
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 网络状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- WiFi 状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 允许程序访问电话状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 允许程序在手机屏幕关闭后后台进程仍然运行 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- 摄像头权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 允许程序录制声音通过手机或耳机的麦克 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 允许程序修改声音设置信息 -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- 写SD权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允许程序振动 -->
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 允许程序连接配对过的蓝牙设备 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<!-- 6.0之后判断是否有悬浮窗权限,没有则申请权限 -->
 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!-- 6.0之后判断是否有悬浮窗权限,没有则申请权限 -->
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /><!-- 摄像头权限 -->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature
	android:name="android.hardware.bluetooth"
	android:required="false" />
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 网络状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- WiFi 状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 允许程序访问电话状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 允许程序在手机屏幕关闭后后台进程仍然运行 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- 摄像头权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 允许程序录制声音通过手机或耳机的麦克 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 允许程序修改声音设置信息 -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- 写SD权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允许程序振动 -->
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 允许程序连接配对过的蓝牙设备 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<!-- 6.0之后判断是否有悬浮窗权限,没有则申请权限 -->
 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!-- 6.0之后判断是否有悬浮窗权限,没有则申请权限 -->
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

# 步骤三:混淆规则

将JRTCSDK类加入不混淆名单

-keep class com.juphoon.rtc.MtcEngine {
      private static int notified(java.lang.String , int , java.lang.String );
    }
-keep class com.juphoon.rtc.MtcEngineRoom {
    static void onAudioOutput(java.lang.String , byte[] ,
                              int , int , int );
}
-keep interface com.justalk.cloud.zmf.ZmfVideo$*Callback { *; }
-keep interface com.justalk.cloud.zmf.Zmf$*Callback { *; }
-keep interface com.justalk.cloud.lemon.MtcImageFilter { *; }
-keep class com.justalk.cloud.zmf.Zmf { *; }
-keep class com.justalk.cloud.zmf.CamDrv { *; }
-keep class com.justalk.cloud.zmf.UVCCamera { *; }
-keep class com.justalk.cloud.zmf.I420Image { *; }
-keep class com.justalk.cloud.lemon.MtcPathCb { *; }
-keep class com.justalk.cloud.avatar.** { *; }-keep class com.juphoon.rtc.MtcEngine {
      private static int notified(java.lang.String , int , java.lang.String );
    }
-keep class com.juphoon.rtc.MtcEngineRoom {
    static void onAudioOutput(java.lang.String , byte[] ,
                              int , int , int );
}
-keep interface com.justalk.cloud.zmf.ZmfVideo$*Callback { *; }
-keep interface com.justalk.cloud.zmf.Zmf$*Callback { *; }
-keep interface com.justalk.cloud.lemon.MtcImageFilter { *; }
-keep class com.justalk.cloud.zmf.Zmf { *; }
-keep class com.justalk.cloud.zmf.CamDrv { *; }
-keep class com.justalk.cloud.zmf.UVCCamera { *; }
-keep class com.justalk.cloud.zmf.I420Image { *; }
-keep class com.justalk.cloud.lemon.MtcPathCb { *; }
-keep class com.justalk.cloud.avatar.** { *; }