# ABCReadingBookAndroidSdkDemo
**Repository Path**: kong09/ABCReadingBookAndroidSdkDemo
## Basic Information
- **Project Name**: ABCReadingBookAndroidSdkDemo
- **Description**: ABCReadingBookSdk android版本 Demo
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2018-12-10
- **Last Updated**: 2020-12-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ABC Reading SDK Android 文档
> [注册](#register)
>
> [集成](#make)
>
> [语音评测配置](#voice_eval)
>
> [支付配置](#payment)
>
> [调起SDK页面](#start)
>
> [统计](#statistics)
>
> [混淆](#proguard)
>
> [权限](#permission)
ABC Reading SDK是对ABC Reading APP中绘本阅读功能的输出,其中包含了绘本馆,绘本阅读功能。
[查看版本信息][update_id]
[update_id]:https://gitee.com/kong09/ABCReadingBookAndroidSdkDemo/blob/master/UpdateDocument.md
### 1. 注册
首先使用ABC Reading SDK之前需要先向我们注册App,来获得APP认证信息。**同时还需要提供APP签名的SHA1码**否则无法使用绘本阅读功能。
### 2. 集成
我们目前只支持针对合作方提供sdk,没有公共下载渠道。
* 项目中集成
1. 将sdk复制到项目libs目录下
2. 将libappsignpwd-lib.so复制到jniLibs目录下
3. 添加语音评测引擎工具类。
4. 在Application中配置项目
5. 依赖库添加
#### 2.1 sdk包集成
在sdk包集成中,开发者需要将sdk和libappsignpwd-lib.so文件集成到项目中。其中sdk包(library-XXX.aar)放在项目的libs目录下,libappsignpwd-lib.so则需要向我们定制对应类型cpu兼容类型的so文件,并放在jniLibs下的对应文件中。
#### 2.2 语音评测引擎工具类
##### 情况一:项目中集成过ssound.jar
如果项目中已经集成ssound.jar语音sdk,就需要使用我们针对ssound.jar封装的工具类ABCVoiceEvalEngineNet类。ABCVoiceEvalEngine语音评测引擎工具类是语音评测引擎接口VoiceEvalEngine的实现,需要添加到项目中用来完成语音评测功能的。**该评测类不支持本地语音评测只支持在线评测**。
##### 情况二:项目中没有ssound.jar
如果项目中没有集成ssound.jar,就需要添加speech.aar包来实现语音评测核心功能(**如果项目中使用speech.aar,内部是包含ssound.jar的**),我们也封装了对应的工具类ABCVoiceEvalEngine,同样是通过实现VoiceEvalEngine接口。**该评测类添加方式支持本地和在线语音评测**。
#### 2.3 在Application中配置项目
sdk集成中需要在Application中进行初始化操作,需要使用ABCLibraryApi类,进行初始化操作。
* 初始化内容分为三个:
1. 注册App相关信息
2. 配置语音评测引擎
3. 设置支付页面
4. 设置兑换页面
5. 设置服务器类型
6. 设置首页背景
7. 设置图片加载器
##### 2.3.1 app信息注册
ABCLibraryApi.init(< appId >, < appKey >);
##### 2.3.2 配置语音评测引擎
ABCLibraryApi.setupSpeechEngine(arg);
在这里进行语音引擎的配置操作,arg为语音引擎实例。
##### 2.3.3 设置支付页面
ABCLibraryApi.setupPaymentView(arg);
这里进行支付页面设置,arg为支付页面的class。
##### 2.3.4 设置兑换页面
ABCLibraryApi.setupExchangeCodeView(arg);
这里进行支付页面设置,arg为兑换页面的class。
##### 2.3.5 设置服务器类型
ABCLibraryApi.debug(true);
这里进行服务器设置,默认false是线上服务器,true是测试服务器。
##### 2.3.6 设置不同Level背景图片
ABCLibraryApi.setResConfig(LibraryBackground.BG_LEVEL_AA, R.drawable.xxx);
##### 2.3.7 设置默认图片加载器
ABCLibraryApi.setImageStrategy(new GlideImageLoaderStrategy());
#### 2.4 添加sdk依赖库
由于本sdk是UI类型的sdk,需要依赖一些第三方库。
```
api 'androidx.annotation:annotation:1.0.0'
api 'androidx.appcompat:appcompat:1.0.0'
api 'androidx.recyclerview:recyclerview:1.0.0'
api 'androidx.cardview:cardview:1.0.0'
api 'androidx.legacy:legacy-support-v4:1.0.0'
api 'com.squareup.retrofit2:retrofit:2.3.0'
api 'com.squareup.retrofit2:converter-gson:2.3.0'
api 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
api 'com.squareup.okhttp3:okhttp:3.9.0'
api 'com.squareup.okhttp3:logging-interceptor:3.9.0'
api 'io.reactivex.rxjava2:rxjava:2.1.5'
api 'io.reactivex.rxjava2:rxandroid:2.1.5'
api 'com.airbnb.android:lottie:3.4.0'
api 'com.aliyun.dpa:oss-android-sdk:2.9.2'
```
### 3. 语音评测配置
sdk内部有语音评测功能但是没有封装语音评测功能sdk,通过公共api接口(VoiceEvalEngine)在全局配置中添加评测引擎的方式实现。将功能拆分放在sdk外部,开发者可以自己定制不同的语音引擎。这里我们只根据ssound.jar提供两种语音引擎。
语音引擎接口VoiceEvalEngine
```
public interface VoiceEvalEngine {
/**
* 初始化评分引擎
*/
void newEngine(Context var1);
/**
* 设置录音评分结束回调
*/
void setOnVoiceEvalStopListener(VoiceEvalEngine.OnVoiceEvalResultListener var1);
/**
* 设置录音结束回调
*/
void setOnRecordStopListener(VoiceEvalEngine.OnRecordListener var1);
/**
* 判断打分引擎是否可用
*/
boolean isAvailable();
/**
* 判断是否正在录音
*/
boolean isRecording();
/**
* 启动录音评测
*
* @param var1 为评测录音对照文本
*/
void startRecordEval(String var1);
/**
* 停止录音
*/
void stopRecord();
/**
* 取消录音
* 需要删除本地录音资源
*/
void cancelRecord();
/**
* 删除录音
* 需要回收资源
*/
void deleteRecord();
/**
* 返回当前语音引擎类是否使用网络进行评测
*/
boolean isNetworking();
/**
* 最少录音时长-毫秒
* @return 最少录音时长 500~1000
*/
int leastRecordMillisecond();
public interface OnRecordListener {
/*
* 录音结束监听
* var1 为null时,录音正常结束
* 出现异常时,需要回传异常
*/
void onRecordStop(Throwable var1);
}
public interface OnVoiceEvalResultListener {
/*
* 语音评测结果回调
* var1 语音文件的本地路径
* var2 评测分数
*/
void onVoiceEvalResult(String var1, String var2);
}
}
```
### 4. 支付配置
通过在Application中配置,在项目中进行购买时就会跳转到配置好的页面中,进行支付操作。
#### 4.1 携带参数
会通过Intent携带用户和购买信息
```
Intent intent = getIntent();
uid = intent.getStringExtra("uid");
levelId = intent.getStringExtra("levelId");
levelName = intent.getStringExtra("levelName");
```
开发者可以通过用户信息进行支付流程的操作。
#### 4.2 支付成功通知服务器更新用户数据
如果用户支付成功,可以通过ABCLibraryApi.getApiService().addOrder()方式通知并更新用户数据。
***这里需要接入方在服务器接口也进行一次同步***
例如:
```
ABCLibraryApi.getApiService().addOrder(
uid, //该平台用户ID
levelId,//购买level对应id / 全level购买默认Id 1000
levelName,//购买level对应name
"1",//购买时长 1半年 2一年 3一月
money,//购买支付金额,单位分
order_no,//第三方订单号
String.valueOf(System.currentTimeMillis() / 1000),//支付时间,精确到秒
new IApiCallback() {
@Override
public void onApiSuccess() {
//订单添加成功
//如果操作成功,需要设置返回成功标志,否则无法刷新书架绘本带锁状态
setResult(PaymentJump.RESULT_SUCCESS);
}
@Override
public void onApiFail(String errMsg) {
//订单添加失败
}
}
);
```
通过setResult(PaymentJump.RESULT_SUCCESS),设置返回结果的方式进行跨界面通知,刷新用户信息,绘本解锁。
### 5. 调起SDK页面
调起sdk的绘本馆页面,同样适用ABCLibraryApi。
```
UserData data = new UserData();
data.uid = "10001";//用户id
data.age = "11";//年龄
data.grade = "5";//年级
data.client = "3";//用户端口:1 教师 2 课堂 3学生端
data.sex = "1";//0保密,1男,2女
data.province = "北京";
data.city = "北京市";
data.area = "海淀区";
ABCLibraryApi.startLibrary(this, data);
```
调起绘本馆需要传入用户数据,用来注册用户信息。
### 6. 统计
sdk中加入了统计代码,支持TalkingData,友盟和mta三个平台,在打包使用时需要定制统计功能,**否则会影响app中原有统计功能**。请在集成项目时向我们定制统计类型。
### 7. 混淆
##### okhttp
```
#okhttp
-keep class okhttp3.internal.**{*;}
-dontwarn okio.**
-dontwarn okhttp3.logging.**
```
##### retrofit
```
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Exceptions
-keepclassmembers,allowshrinking,allowobfuscation interface * {
@retrofit2.http.* ;
}
-dontwarn javax.inject.**
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
```
##### RxJava & RxAndroid
```
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
```
##### Gson
```
-keep class com.google.gson.stream.** { *; }
-keepattributes EnclosingMethod
```
##### 友盟
如果使用SDK中的友盟统计,需要添加
```
-keep class com.umeng.** {*;}
-keepclassmembers class * {
public (org.json.JSONObject);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
```
##### TalkingData
如果使用SDK中的TalkingData统计,需要添加
```
-dontwarn com.tendcloud.tenddata.**
-keep class com.tendcloud.** {*;}
-keep public class com.tendcloud.tenddata.** { public protected *;}
-keepclassmembers class com.tendcloud.tenddata.**{
public void *(***);
}
-keep class com.talkingdata.sdk.TalkingDataSDK {public *;}
-keep class com.apptalkingdata.** {*;}
-keep class dice.** {*; }
-dontwarn dice.**
```
##### mta
如果使用SDK中的mta统计,需要添加
```
-keep class com.tencent.stat.*{*;}
-keep class com.tencent.mid.*{*;}
```
##### 七牛
```
#七牛上传(2.2.0及之后不再需要)
-keep class com.qiniu.**{*;}
-keep class com.qiniu.**{public ();}
-ignorewarnings
```
##### ali-oss
```
#ali-oss上传
-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**
```
##### 语音评测包
```
#语音评测包混淆代码
-keep class com.tt.* { *; }
-keep class com.xs.* { *; }
-keep interface com.xs.* { *; }
-keep enum com.xs.* { *; }
```
##### 本应用需添加混淆
```
-keep public class com.abctime.api.** { *; }
-keep public class * implements com.abctime.library.IGsonData
```
### 8. 权限
本SDK需要使用到麦克风权限和内存权限,其中对麦克风权限有处理,**内存权限需要宿主应用处理运行权限**