FinClip为企业提供小程序生态圈技术产品,开发者可在FinClip小程序开发帮助中心找到相关FinClip小程序指引

# 扩展 SDK

除了核心SDK之外,我们还提供了扩展SDK,扩展SDK是一个依赖核心SDK的库,里面提供了核心SDK中所没有的各种小程序API。

之所以提供扩展SDK,是因为既要保证核心SDK足够轻量,又要保证小程序API足够丰富。核心SDK负责建立起运行小程序的基础框架并提供一小部分最不可获取的API,在权限方面仅保留了存储、相机、地理位置等基本权限,体积仅1MB多一点,扩展SDK则是作为核心SDK的补充而存在的,里面API将不断丰富和完善。

获取扩展 SDK

您可登录 资源下载中心 (opens new window) 下载 Android SDK 文件,扩展 SDK 也处于在所下载的压缩包中。

如果希望使用扩展SDK中的API,在gradle中依赖扩展SDK库即可:

implementation 'com.finogeeks.mop:plugins:x.y.z' //x.y.z须替换为具体的版本号

# 1. 扩展 SDK

# 1.1 扩展SDK中小程序API概览

api名称 api描述信息
getLocation 获取位置信息
startRecord 开始录音
stopRecord 停止录音
RecorderManager 全局唯一的录音管理器

# 1.2 扩展SDK涉及到的敏感权限

权限 相关接口、组件
获取位置信息 getLocation
录制音频 startRecord、recorderManager组件start

# 2. MapSDK

MapSDK支持Map组件及位置API。 其依赖于核心SDK,做为地图位置功能的补充。 其中提供的地图、定位能力依赖于第三方地图、定位SDK。支持高德地图|高德定位百度地图|百度定位谷歌地图|谷歌定位三种组合情况使用。

注意

高德、百度、谷歌方案对位置API的支持情况请查看「开发-API-位置」

# 2.1 集成

  1. 在gradle中依赖MapSDK库:

    implementation 'com.finogeeks.mop:map:x.y.z' //x.y.z须替换为具体的版本号
    
  2. 由于MapSDK实现的地图、定位能力依赖于第三方地图、定位SDK,因此,还需要宿主APP集成第三方地图、定位SDK,并完成API_KEY、Service注册等。

注意

请选择以下第三方SDK提供方中的一个进行集成。
如需了解第三方SDK详细集成说明,请参考第三方SDK官方集成文档。

依赖第三方SDK库:(请选其一)

//高德
implementation 'com.amap.api:3dmap:8.0.0' //可以替换为您需要的版本号
implementation 'com.amap.api:location:5.5.1' //可以替换为您需要的版本号
implementation 'com.amap.api:search:7.9.0' //可以替换为您需要的版本号
//百度
implementation 'com.baidu.lbsyun:BaiduMapSDK_Map:7.4.0' //可以替换为您需要的版本号
implementation 'com.baidu.lbsyun:BaiduMapSDK_Location:9.1.8' //可以替换为您需要的版本号
implementation 'com.baidu.lbsyun:BaiduMapSDK_Search:7.4.0' //可以替换为您需要的版本号
//谷歌
implementation 'com.google.android.gms:play-services-maps:16.1.0' //建议使用此版本,可以替换为您需要的版本号,但不支持此以上版本
implementation 'com.google.android.gms:play-services-location:16.0.0' //建议使用此版本,可以替换为您需要的版本号,但不支持此以上版本

AndroidManifest.xml注册第三方SDK的API_KEY及Service:(根据您依赖的第三方SDK选其一)

//高德
<meta-data
    android:name="com.amap.api.v2.apikey"
    android:value="您申请的ApiKey" />

<service android:name="com.amap.api.location.APSService" />
//百度
<meta-data
    android:name="com.baidu.lbsapi.API_KEY"
    android:value="您申请的ApiKey" />

<service
    android:name="com.baidu.location.f"
    android:enabled="true"
    android:process=":remote" />
//谷歌
<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="您申请的ApiKey" />

build.gradle中配置第三方SDK支持的SO库架构:

android {
    defaultConfig {
        ndk {
            //设置支持的SO库架构(您可以根据需要,选择一个或多个平台的so)
            abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86","x86_64"
        }
    }
}

# 2.2 MapSDK涉及到的敏感权限

权限 相关接口、组件
获取位置信息 getLocation等相关api

# 3. 蓝牙SDK

使用蓝牙接口需要单独集成蓝牙SDK,集成后接口即可生效,无需配置。

集成方式:

implementation 'com.finogeeks.mop:bluetooth:x.y.z'

# 3.1 蓝牙SDK相关api概览

api名称 api描述信息
蓝牙-通用 一系列的api
蓝牙-低功耗中心设备 一系列的api
蓝牙-低功耗外围设备 一系列的api
蓝牙-信标 一系列的api

# 3.2 蓝牙SDK涉及到的敏感权限

权限 相关接口、组件
蓝牙 蓝牙组件相关接口

# 4. 声网SDK

使用声网相关的接口需要单独集成声网SDK,集成后接口即可生效,无需配置。

集成方式:

implementation 'com.finogeeks.mop:agora:x.y.z'

若您使用导入aar的方式接入声网SDK,需要额外添加声网依赖:

implementation 'io.agora.rtc:full-sdk:3.5.0'

# 4.1 声网SDK相关api概览

api名称 api描述信息
init 初始化声网SDK
setRole 设置客户端角色
join 加入频道
publish 开始推流
muteLocal 本地静音
unmuteLocal 解除本地静音
mute 远端静音
unmute 解除远端静音
renewToken 刷新token
setRemoteVideoStreamType 设置订阅的视频流类型
destroy 停止推流,释放资源

# 4.2 声网SDK涉及到的敏感权限

权限 相关接口、组件
录制音频 join
摄像头 publish

# 5. WebRTCSDK

使用WebRTC相关的接口需要单独集成WebRTCSDK,集成后接口即可生效,无需配置。

集成方式:

implementation 'com.finogeeks.mop:webrtc:x.y.z'

若您使用导入aar的方式接入WebRTCSDK,需要额外添加WebRTC依赖:

implementation 'org.webrtc:google-webrtc:1.0.32006'

# 5.1 WebRTCSDK相关api概览

api名称 api描述信息
mediaDevices MediaDevices相关接口,提供访问连接媒体输入的设备,如照相机和麦克风,以及屏幕共享等。它可以使你取得任何硬件资源的媒体数据。
rtcPeerConnection RTCPeerConnection相关接口,代表一个由本地计算机到远端的WebRTC连接。该接口提供了创建,保持,监控,关闭连接的方法的实现。
mediaStream MediaStream相关接口,代表一个媒体内容的流。一个流包含几个轨道,比如视频和音频轨道。
mediaRecorder MediaRecorder相关接口,提供媒体录制器等相关api。

# 5.2 WebRTCSDK涉及到的敏感权限

权限 相关接口、组件
摄像头 getUserMedia
录制音频 getUserMedia

# 6. 联系人SDK

使用联系人相关的接口需要单独集成联系人SDK,集成后接口即可生效,无需配置。

集成方式:

implementation 'com.finogeeks.mop:contact:x.y.z'

# 6.1 联系人SDK相关api概览

api名称 api描述信息
addPhoneContact 添加手机通讯录联系人API的名称

# 7. 剪贴板SDK

使用剪贴板相关的接口需要单独集成剪贴板SDK,集成后接口即可生效,无需配置。

集成方式:

implementation 'com.finogeeks.mop:clipboard:x.y.z'

# 7.1 剪贴板SDK相关api概览

api名称 api描述信息
setClipboardData 设置剪贴板内容
getClipboardData 获取剪贴板内容

# 8. Media SDK

2.38.0版本以后支持

video组件的边下边播需要集成此SDK才能实现。

集成方式:

android {
    packagingOptions {
        doNotStrip "*/arm64-v8a/libijkffmpeg.so"
        doNotStrip "*/arm64-v8a/libijkplayer.so"
        doNotStrip "*/arm64-v8a/libijksdl.so"

        doNotStrip "*/armeabi/libijkffmpeg.so"
        doNotStrip "*/armeabi/libijkplayer.so"
        doNotStrip "*/armeabi/libijksdl.so"

        doNotStrip "*/armeabi-v7a/libijkffmpeg.so"
        doNotStrip "*/armeabi-v7a/libijkplayer.so"
        doNotStrip "*/armeabi-v7a/libijksdl.so"

        doNotStrip "*/x86/libijkffmpeg.so"
        doNotStrip "*/x86/libijkplayer.so"
        doNotStrip "*/x86/libijksdl.so"

        doNotStrip "*/x86_64/libijkffmpeg.so"
        doNotStrip "*/x86_64/libijkplayer.so"
        doNotStrip "*/x86_64/libijksdl.so"
    }
}


dependencies {
    implementation 'com.finogeeks.mop:media:x.y.z' //x.y.z须替换为具体的版本号
    implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
}

在proguard-rules.pro文件中添加混淆规则:

# Media SDK
-keep public class com.finogeeks.finclip.plugins.media.player.ijk.FinIjkMediaPlayerFactory {
    public <init>();
}
-keep class com.finogeeks.finclip.plugins.media.player.ijk.IjkMediaPlayerOptionsApplier {
    public static <fields>;
    public static <methods>;
}
-keep class com.finogeeks.finclip.plugins.media.player.ijk.IjkMediaPlayerOptionsApplier$Applier {*;}
-keep class com.finogeeks.finclip.plugins.media.player.ijk.IjkMediaPlayerOptionsApplier$Options {*;}

#ijkplayer
-keep class tv.danmaku.ijk.media.player.** {*;}
-keep class tv.danmaku.ijk.media.player.IjkMediaPlayer{*;}
-keep class tv.danmaku.ijk.media.player.ffmpeg.FFmpegApi{*;}

集成Media SDK后,video组件的播放器实现,会从系统方案MediaPlayer自动切换到IjkMediaPlayer方案,无需做其他操作。

# 8.1 Media SDK的相关API

由于IjkMediaPlayer的配置项非常多,每个App的需求又不同,所以Media SDK将配置功能暴露给App开发者来调用。

class SampleApplication : MultiDexApplication() {

    override fun onCreate() {
        super.onCreate()
        IjkMediaPlayerOptionsApplier.setIjkMediaPlayerOptionsApplier(this) {
            it.setOption(
                IjkMediaPlayer.OPT_CATEGORY_PLAYER,
                "start-on-prepared",
                0
            ) // 禁止自动开始播放,由上层去控制

            it.setOption(
                IjkMediaPlayer.OPT_CATEGORY_PLAYER,
                "max-buffer-size",
                (1024 * 24).toLong()
            ) // 最大缓冲大小,单位kb

            it.setOption(
                IjkMediaPlayer.OPT_CATEGORY_PLAYER,
                "packet-buffering",
                0L
            ) // 如此设置,才会在及时停止加载状态显示

            it.setOption(
                IjkMediaPlayer.OPT_CATEGORY_PLAYER,
                "enable-accurate-seek",
                1
            ) // 设置为精准seek
        }
        // 其他初始化代码……
    }
}

同时如上代码片段中的配置,是Media SDK的默认配置项,App开发者可以按照自己的需要制定相关的配置。

# 8.2 IjkMediaPlayer的一些问题

# 8.2.1 一直加载无法播放

在某些机型上,可能会出现一直加载无法播放的问题。通过Logcat,如果你发现了如下的bug形式:

Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x7783dd1920 in tid 25128 (ff_read), pid 22268

则很有可能,当前应用运行在Android 11且CPU架构为armv8a的机型上,需要在Manifest.xml文件的application标签下,加入一个属性android:allowNativeHeapPointerTagging="false"。具体可参考:[issues/5342](用arm64-v8a崩溃 Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x7783dd1920 in tid 25128 (ff_read), pid 22268 (rmdzh.ijkplayer) · Issue #5342 · bilibili/ijkplayer · GitHub (opens new window))

# 8.2.2 进度不精确

在拖动进度条或者切入切出全屏时,可能会出现进度回退的现象,这是因为播放器需要解析关键帧,只能从关键帧去播放,需要加入如下配置来开启精确seekTo。

it.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1) // 设置为精准seek

需要注意的是,开启精确seekTo后,会导致在暂停状态下,seekTo后,画面不会更新的问题。

# 9. WeChatSDK

微信SDK的快捷接入,提供调起微信通过微信小程序获得登录、用户信息、手机号、支付的能力。

集成方式:

implementation 'com.finogeeks.mop:wechat:x.y.z'

并在项目的build.gradle文件中(如app/build.gradle)添加您在微信开放平台申请的微信APPID:

android {
    // ..其它配置省略
    defaultConfig {
    // ..其它配置省略
    resValue "string", "wechat_sdk_app_id", "您的微信SDKAPPID"
    }
}

注意

使用WeChatSDK必须保证核心SDK版本在2.37.13或以上。

注意

由于WeChatSDK需要覆盖IAppletHandler中的open-type相关的方法,具体为chooseAvatarcontactfeedbackgetPhoneNumberlaunchAppshareAppMessage六个方法。

因此若您实现了IAppletHandler并实现了以上六个方法,WeChatSDK将会接管getPhoneNumber,剩余的五个方法请按以下方式迁移,若您未实现IAppletHandler或没有用到以上六个方法,可以忽略此处。

  1. 实现IWeChatOpenTypeHandler接口:

    class MyWeChatAppletOpenTypeHandler : IWeChatOpenTypeHandler {
        override fun chooseAvatar(callback: IAppletHandler.IAppletCallback) {
           // 您的实现逻辑
        }
    
        override fun contact(json: JSONObject): Boolean {
           // 您的实现逻辑
        }
    
        override fun feedback(bundle: Bundle): Boolean {
           // 您的实现逻辑
        }
    
        override fun launchApp(appParameter: String?): Boolean {
           // 您的实现逻辑
        }
    
        override fun shareAppMessage(
            appInfo: String,
            bitmap: Bitmap?,
            callback: IAppletHandler.IAppletCallback
        ) {
           // 您的实现逻辑
        }
    }
    
  2. 在核心SDK初始化成功后,设置您的实现类。(注意,同核心SDK一样,务必保证是在主进程中设置):

    WeChatOpenTypeClient.instance.iWeChatOpenTypeHandler = MyWeChatAppletOpenTypeHandler()
    

# 9.1 WeChatSDK相关api概览

api名称 api描述信息
login 唤起微信小程序,获取登录凭证,并将结果返回至FinClip小程序
getUserProfile 唤起微信小程序,获取用户信息,并将结果返回至FinClip小程序
requestPayment 唤起微信小程序,发起微信支付,并将结果返回至FinClip小程序
getPhoneNumber 唤起微信小程序,获取到动态令牌,并将结果返回至FinClip小程序
© 2022 FinClip with ❤

👋🏻 嘿,你好!

「FinClip」是一套基于云原生框架设计的小程序容器。能够让任何移动应用在集成小程序SDK之后,获得可用、安全的小程序运行能力。

>> 点我免费注册体验

查看产品文档
了解与 FinClip 相关的一切信息

产品博客 👈  了解产品更新与核心功能介绍
资源下载 👈  获取小程序 SDK 与开发工具
文档中心 👈  查询 FinClip 小程序开发指南与答疑

商务咨询热线
预约 FinClip 产品介绍,咨询商务报价或私有化部署事宜

0755-86967467

获取产品帮助
联系 FinClip 技术顾问,获取产品资料或加入开发者社群

联系线上
人工客服

或 👉  点击这里,提交咨询工单