孕橙智能试纸识别算法之客户端API说明(视频流版)

支持平台

目前孕橙智能试纸识别算法SDK支持以下平台:

  • iOS
  • Android

体验Demo安装

iOS安装

下载地址

iOS fir.rm

APP添加信任

正常情况下,由于iOS的APP是由测试证书打包的,所以无法启动,需要改动以下设置才可以保证demo正常运行,具体设置如下图示:

Android安装

下载地址

Android fir.rm

测试图片下载

调用流程

流程图

流程描述

  1. 调用方输入一张图片给SDK;
  2. SDK判断图片中是否有试纸图片,如果无则返回错误;
  3. 如果有,则弹出试纸识别结果确认框
  4. 在该弹出对话框上,用户可以根据识别结果进行T、C线拖动调整,翻转调整;
  5. 如果用户在页面点击了“返回”按钮,则试纸结果确认对话框消失,调用重新进行下一张图片的识别;
  6. 如果用户在页面点击了“确认”按钮,则试纸结果确认对话框消失,调用方获取返回的试纸T、C线位置,抠出的图片内容以及LH Level等;
1
2
3
4
5
6
7
*几点约定:

1. 对于输入的图片,我们要求必须是正方形,对于传入的长方形的图片,偶尔可能成功,但是不建议使用;
2. 返回的T、C线为算法经过算法计算一个均值线;
3. 虽然目前试纸API返回了试纸T、C线的4条边界“直线”,但是这4条“直线”边界本身可能不是一个严格的边界,有些看起来是白色区域,但是可能被包含在T、C线区域内,具体原因如下:
(1). 试纸的T、C边界本身就不是一个boundry clear的边界;
(2). 有时候肉眼无法看出的细微的“红色”,但是在计算机图形学里面可能就是一个色值,然后从T、C线的角度来说,可能会被计算在内;*

模块结构图

试纸识别结果确认框

对话框说明

一旦智能试纸识别API从图片中识别出试纸,则弹出定制的试纸识别结果确认框(如下图),该确认框有如下作用:

  • 试纸识别结果识别是一件从“医疗级”来说非常严肃的事情,所以经过用户的double confirm是必要的;
  • 如果用户发现C、T线识别的位置不对,可以手动拖动进行修改,给试纸的结果识别带来一个潜在的“补救”机会;
  • 如果用户发现识别出试纸“左右颠倒”,可以手动拖动进行修改,给试纸的结果识别带来一个潜在的“补救”机会;
  • 调用方不需要处理确认页的“拖动”以及“点击”事件,更专注于自己的“业务逻辑”;

相关配置项

如下图,定制项如下:

  • 确认界面的语言以及对应的描述;
  • “确认”以及“返回”按钮的颜色以及图片;
  • 抠出图片宽度外延的像素点;

SDK代码说明

iOS

代码示例

Demo 地址:https://e.coding.net/yuncheng/shecarepasdkdemo-ios/master.git (SDK 在 Demo 里)

函数说明

SDK Config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/** 设置 SDK 环境。默认是测试环境 YCSEnvironmentDebug */
@property (assign, nonatomic) YCSEnvironment environment;
/** 应用授权相关的 appID */
@property (nonatomic, copy) NSString *appID;
/** 应用授权相关的 appSecret */
@property (nonatomic, copy) NSString *appSecret;
/** 固定值,不需要设置 */
@property (nonatomic, copy) NSString *sessionId;
/** 用户身份标识符,全局唯一且同一个用户固定不变 */
@property (nonatomic, copy) NSString *userID;
/** 结果确认页 UI 主色调 */
@property (nonatomic, strong) UIColor *mainColor;
/** 结果确认页 字体 主色调 */
@property (nonatomic, strong) UIColor *textColor;
/** 结果确认页 “取消” 按钮图片 */
@property (nonatomic, strong) UIImage *cancelImg;
/** 结果确认页 “确认” 按钮图片 */
@property (nonatomic, strong) UIImage *confirmImg;
/** 结果确认页 T 滑块图片 */
@property (nonatomic, strong) UIImage *tImage;
/** 结果确认页 C 滑块图片 */
@property (nonatomic, strong) UIImage *cImage;
/** 结果确认页 标题 */
@property (nonatomic, copy) NSString *title;
/** 结果确认页 “翻转” 按钮标题 */
@property (nonatomic, copy) NSString *flipTitle;
/** 结果确认页 说明 */
@property (nonatomic, copy) NSString *comment;
/** 算法返回的图片是否需要 “外扩”,默认否 */
@property (nonatomic, assign, getter=isExtended) ``BOOL` `extended;
/** “外扩” 的像素(仅在 extended=true 时有效) */
@property (nonatomic, assign) NSInteger pixelOfExtended;
/** 扫描超时时长。默认为 15s,最少为 1s(仅在视频流扫描模式下有效) */
@property (nonatomic, assign) CFTimeInterval timeIntervalOfScan;
/** “连续成功” 的最少次数,默认为 5 次。为保证扫描结果准确性,建议采用 “连续多次扫描成功才认为整个流程成功” 的判定方法。(仅在视频流扫描模式下有效) */
@property (nonatomic, assign) NSUInteger numberOfSuccess;
/** 相同错误码连续出现的次数,默认为 3 次。算法可能在短时间内返回很多错误码,为保证用户体验,建议设置此值。用于控制 “相同错误码连续出现若干次,才在 UI 上提示用户” (仅在视频流扫描模式下有效) */
@property (nonatomic, assign) NSUInteger numberOfErrors;
/** 0未知;1 相册;2 拍照 */
@property (nonatomic, assign) SCImageType source;

主函数调用

1
2
3
4
5
6
7
8
/*! @brief 获取一张图片的扫描和分析结果
* @param image 用于扫描的试纸照片
* @param completion 完成回调,用于返回扫描和分析的结果
*/
-(``void``)getScanResultFromImage:(UIImage *)image completion:(``void` `(^)(SCPaperAnalysiserResult *result))completion;
/*! @brief 结束扫描和分析流程
*/
-(``void``)closeSession:(SCPaperAnalysiserResult * _Nullable)result;

返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/** 最终返回的抠图结果 */
@property (nonatomic, strong, readonly) UIImage *finalImage;
/** 算法返回的 四边形 坐标点 */
@property (nonatomic, strong, nullable) NSArray *maskPoints;
/** 算法返回的 错误码 */
@property (nonatomic, assign) SCErrorCode errorCode;
/** 算法返回的 模糊度 */
@property (nonatomic, assign) CGFloat blurExtent;
/** 算法返回的 C 线位置 */
@property (nonatomic, assign) CGFloat cPosition;
/** 算法返回的 T 线位置 */
@property (nonatomic, assign) CGFloat tPosition;
/** 算法返回的 T 线区域左边缘位置 */
@property (nonatomic, assign) CGFloat lhTlineLeft;
/** 算法返回的 T 线区域右边缘位置 */
@property (nonatomic, assign) CGFloat lhTlineRight;
/** 算法返回的 C 线区域左边缘位置 */
@property (nonatomic, assign) CGFloat lhClineLeft;
/** 算法返回的 C 线区域右边缘位置 */
@property (nonatomic, assign) CGFloat lhClineRight;
/** 用户确认的 C 线位置 */
@property (nonatomic, assign) CGFloat newCPosition;
/** 用户确认的 T 线位置 */
@property (nonatomic, assign) CGFloat newTPosition;
/** 是否翻转 */
@property (nonatomic, assign) ``BOOL` `flipped;
/** 算法返回的试纸分析结果 */
@property (nonatomic, assign) NSInteger lhResult;
/** 用户确认的试纸结果 */
@property (nonatomic, assign) NSInteger newLHResult;
/** 算法返回的 Ratio 值 */
@property (nonatomic, assign) CGFloat lhRatio;
/** 算法返回的试纸类型 */
@property (nonatomic, assign) SCPaperType paperType;
/** 试纸测试时间 */
@property (nonatomic, strong) NSDate *lhTime;
/** 试纸图片来源:1 相册;2 拍照 */
@property (nonatomic, assign) SCImageType source;

错误描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/// 试纸抠图、分析错误码
typedef NS_ENUM(NSInteger, SCErrorCode) {

/// 抠图成功、分析成功,流程内没有错误产生;
SCErrorCodeNoError = 0,

/// SDK 校验失败或无效
SCErrorCodeSDKError = -2,
/// 未知错误(默认值);
SCErrorCodeUnknownError = -1,

/* 阶段 1 中间过程错误码(或单张照片扫描结果的错误码) */
/// 没有找到试纸;
SCErrorCodeNoPaper = 1,
/// 距离过远;
SCErrorCodeTooFar = 2,
/// 背景过脏;
SCErrorCodeTooDirty = 3,
/// 距离过近;
SCErrorCodeTooClose = 4,
/// 试纸不全;
SCErrorCodeNotCompleted = 5,
/// 神经网络加载错误;
SCErrorCodeHedNetError = 6,
/// 背景内不止一张试纸;
SCErrorCodeTooManyPapers = 7,
/// 曝光不足;
SCErrorCodeUnderExposure = 8,
/// 曝光过度;
SCErrorCodeExposed = 9,
/// 试纸局部曝光过度;
SCErrorCodePartlyExposed = 10,
/// 画面模糊;
SCErrorCodeBlurred = 11,
/// 曝光不足(OpenCV 二次确认);
SCErrorCodeUnderExposure2 = 12,

/* 阶段 1 结束错误码 */
/// 抠图失败,视频流扫描超时
SCErrorCodeVideoOutofDate = 17,

/* 阶段 2 错误码 */
/// 抠图成功,但是分析失败
SCErrorCodeGetValueError = 101,

/* 阶段 3 错误码 */
/// 抠图成功,分析成功,但是用户取消确认抠图和分析结果
SCErrorCodeUserCanceled = 201,
/// 抠图成功,分析成功,但未检测到参考线,请确认试纸有参考线显示
SCErrorCodeNoCLine = 202,
};

如何debug

SDK 的日志会和应用里的 NSLog(Swift 对应 print)输出到一起,分别以 Shecare(Debug)、Shecare(Info)、Shecare(Error) 开头表示不同的日志等级。需要 Debug 时,把 Shecare 开头的日志上传即可。

Android

代码示例

Demo 地址:https://e.coding.net/yuncheng/ScPaperAnalysiserDemo_Android.git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
一.引入试纸sdk库
api ``'com.ikangtai.papersdk:ScPaperAnalysiserLib:1.4.1'
二.添加依赖库地址
maven { url ``'https://dl.bintray.com/ikangtaijcenter123/ikangtai'` `}
三.使用方法
1``.初始化
``/**
``* 使用测试网络
``*/
``Config.setTestServer(``true``);
``/**
``* 网络超时时间
``*/
``Config.setNetTimeOut(``30``);
``//初始化sdk
``paperAnalysiserClient = ``new` `PaperAnalysiserClient(getContext(), AppConstant.appId, AppConstant.appSecret, ``"xyl1@qq.com"``);
``//定制试纸Ui显示
``/**
``* 标题
``*/
``String titleText = getContext().getString(com.ikangtai.papersdk.R.string.paper_result_dialog_title);
``/**
``* 标题颜色
``*/
``int` `titleTextColor = getContext().getResources().getColor(com.ikangtai.papersdk.R.color.color_444444);
``/**
``* 标尺线
``*/
``int` `tagLineImageResId = com.ikangtai.papersdk.R.drawable.paper_line;
``/**
``* t滑块图标
``*/
``int` `tLineResId = com.ikangtai.papersdk.R.drawable.test_paper_t_line;
``/**
``* c滑块图标
``*/
``int` `cLineResId = com.ikangtai.papersdk.R.drawable.test_paper_c_line;
``/**
``* 水平翻转文字
``*/
``String flipText = getContext().getString(com.ikangtai.papersdk.R.string.paper_result_dialog_flip);
``/**
``* 水平翻转文字颜色
``*/
``int` `flipTextColor = getContext().getResources().getColor(com.ikangtai.papersdk.R.color.color_67A3FF);
``/**
``* 提示文字
``*/
``String hintText = getContext().getString(com.ikangtai.papersdk.R.string.paper_result_dialog_hit);
``/**
``* 提示文字颜色
``*/
``int` `hintTextColor = getContext().getResources().getColor(com.ikangtai.papersdk.R.color.color_444444);
``/**
``* 返回图片
``*/
``int` `backResId = com.ikangtai.papersdk.R.drawable.test_paper_return;
``/**
``* 确认图片
``*/
``int` `confirmResId = com.ikangtai.papersdk.R.drawable.test_paper_confirm;
``/**
``* tc线默认值宽度
``*/
``float` `tcLineWidth = getContext().getResources().getDimension(com.ikangtai.papersdk.R.dimen.dp_2);
``/**
``* 返回按钮背景
``*/
``int` `backButtonBgResId = com.ikangtai.papersdk.R.drawable.paper_button_drawable;
``/**
``* 确认按钮背景
``*/
``int` `confirmButtonBgResId = com.ikangtai.papersdk.R.drawable.paper_button_drawable;
``/**
``* 返回按钮文字
``*/
``String backButtonText = getContext().getString(com.ikangtai.papersdk.R.string.paper_result_back);
``/**
``* 确认按钮文字
``*/
``String confirmButtonText = getContext().getString(com.ikangtai.papersdk.R.string.paper_result_confirm);
``/**
``* 显示底部按钮
``*/
``boolean` `visibleBottomButton = ``false``;
``UiOption uiOption = ``new` `UiOption.Builder()
``.titleText(titleText)
``.tagLineImageResId(tagLineImageResId)
``.titleTextColor(titleTextColor)
``.tLineResId(tLineResId)
``.cLineResId(cLineResId)
``.flipText(flipText)
``.flipTextColor(flipTextColor)
``.hintText(hintText)
``.hintTextColor(hintTextColor)
``.backResId(backResId)
``.confirmResId(confirmResId)
``.tcLineWidth(tcLineWidth)
``.backButtonBgResId(backButtonBgResId)
``.backButtonText(backButtonText)
``.confirmButtonBgResId(confirmButtonBgResId)
``.confirmButtonText(confirmButtonText)
``.visibleBottomButton(visibleBottomButton)
``.build();
``//试纸识别sdk相关配置
``Config config = ``new` `Config.Builder().pixelOfdExtended(``true``).margin(``10``).uiOption(uiOption).build();
``paperAnalysiserClient.init(config);

2``.调用识别试纸图片
``//传入正方形图片,否则会影响识别速度和识别正确率
``paperAnalysiserClient.analysisBitmap(fileBitmap, ``new` `IBitmapAnalysisEvent() {
``@Override
``public` `void` `showProgressDialog() {
``ToastUtils.show(getContext(), ``"显示加载框"``);
``}

``@Override
``public` `void` `dismissProgressDialog() {
``ToastUtils.show(getContext(), ``"隐藏加载框"``);
``}
``@Override
``public` `void` `cancel() {
``ToastUtils.show(getContext(), ``"取消试纸编辑"``);
``}
``@Override
``public` `void` `save(PaperResult paperResult) {
``if` `(!TextUtils.isEmpty(paperResult.getErrMsg())) {
``ToastUtils.show(getContext(), paperResult.getErrMsg());
``}
``}
``@Override
``public` `boolean` `analysisSuccess(PaperCoordinatesData paperCoordinatesData, Bitmap originSquareBitmap, Bitmap clipPaperBitmap) {
``endTime = System.currentTimeMillis();
``return` `false``;
``}
``@Override
``public` `void` `analysisError(PaperCoordinatesData paperCoordinatesData, String errorResult, ``int` `code) {
``ToastUtils.show(getContext(), errorResult + code);
``}
``@Override
``public` `void` `saasAnalysisError(String errorResult, ``int` `code) {
``ToastUtils.show(getContext(), errorResult + code);
``}
``});
3``.修改识别结果
``paperAnalysiserClient.updatePaperValue(paperValue)
4``.调用完成释放资源

``paperAnalysiserClient.closeSession();

函数说明

SDK Config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
public class PaperAnalysiserClient {
/**
* @param context
* @param appId appId
* @param appSecret appSecret
* @param unionId 用户唯一id
*/
public PaperAnalysiserClient(Context context, String appId, String appSecret, String unionId);
/**
* 初始化
* @param config
*/
public void init(Config config);
/**
* 识别试纸图片并弹出试纸识别结果弹框
* @param fileBitmap 试纸图片bitmap
* @param event 识别结果回调
*/
public void analysisBitmap(final Bitmap fileBitmap, final IBitmapAnalysisEvent event);
/**
* 手动修改lhValue值
*/
public void updatePaperValue(int paperValue) ;
/**
* 完成流程关闭Session
*/
public void closeSession();
}
//试纸sdk配置
public class Config {
/**
* 模糊阈值
*/
private int blurLimitValue = 25;
/**
* 连续分析成功3次
*/
private int analysisSuccessCount = 3;

/**
* 同一个错误码连续出现2次
*/
private int analysisErrorCount = 2;

/**
* 自动抠图时长15s
*/
private int analysisTime = 15;

/**
* 试纸存储文件夹路径
*/
private String filePath;

/**
* 日志存储路径
*/
private String logFilePath;
/**
* 是否外扩
*/
private boolean pixelOfdExtended;
/**
* 外扩像素
*/
private int margin;
/**
* 弹框ui配置
*/
private UiOption uiOption;
}
//弹框Ui配置
public class UiOption {
/**
* 标题
*/
private String titleText;
/**
* 标题颜色
*/
private int titleTextColor;
/**
* 标尺线
*/
private int tagLineImageResId;
/**
* t滑块图标
*/
private int tLineResId;
/**
* c滑块图标
*/
private int cLineResId;
/**
* 水平翻转文字
*/
private String flipText;
/**
* 水平翻转文字颜色
*/
private int flipTextColor;
/**
* 提示文字
*/
private String hintText;
/**
* 提示文字颜色
*/
private int hintTextColor;
/**
* 返回按钮
*/
private int backResId;
/**
* 确认按钮
*/
private int confirmResId;
/**
* tc线宽度
*/
private float tcLineWidth;
}
//试纸分析回调
public interface IBitmapAnalysisEvent {
/**
* 显示加载框
*/
void showProgressDialog();

/**
* 隐藏加载框
*/
void dismissProgressDialog();

/**
* 试纸结果弹框取消
*/
void cancel();

/**
* 试纸结果弹框保存
*
* @param paperResult 最终确认保存数据
*/
void save(PaperResult paperResult);

/**
* 试纸抠图成功返回结果
*
* @param paperCoordinatesData 抠图结果数据,包括坐标点、模糊值
* @param originSquareBitmap 试纸正方形bitmap
* @param clipPaperBitmap 抠图试纸条
*/
boolean analysisSuccess(PaperCoordinatesData paperCoordinatesData, Bitmap originSquareBitmap, Bitmap clipPaperBitmap);

/**
* 试纸抠图错误
* @param paperCoordinatesData 抠图结果数据,包括坐标点、模糊值可能为空
* @param errorResult 错误描述
* @param code 错误码
*/
void analysisError(PaperCoordinatesData paperCoordinatesData,String errorResult, int code);

/**
* SaaS识别错误
* @param errorResult 错误描述
* @param code 错误码
*/
void saasAnalysisError(String errorResult, int code);
}
//试纸识别结果
public class PaperCoordinatesData {
/**
* 错误码
*/
private int code;
/**
* 模糊值
*/
private double blurValue;
/**
* 上下左右坐标
*/
private Point point1;
private Point point2;
private Point point3;
private Point point4;
/**
* 抠图结果mat对象,可转换成试纸条bitmap
*/
private Mat imageL;
}
//试纸识别弹框保存数据
public class PaperResult {
/**
* id
*/
private String paperId;
/**
* 试纸时间
*/
private String paperTime;
/**
* 错误码
*/
private int errNo;
/**
* 错误描述
*/
private String errMsg;
/**
* tc线比例
*/
private double tLinePos;
private double cLinePos;
/**
* 试纸类型
*/
private int paperType;
/**
* 失败结果
*/
private double paperValue;
/**
* ratio结果
*/
private double ratioValue;
/**
* 是否翻转
*/
private boolean flip;
/**
* 模糊度
*/
private double blurValue;
/**
* 试纸抠图结果
*/
private Bitmap paperBitmap;
/**
* 试纸抠图不加margin结果
*/
private Bitmap noMarginBitmap;
/**
* tc线左右边界位置
*/
private double clineLeft;
private double clineRight;
private double tlineLeft;
private double tlineRight;
}

主函数调用

1
2
3
4
5
6
7
8
/*! @brief 获取一张图片的扫描和分析结果
* @param image 用于扫描的试纸照片
* @param completion 完成回调,用于返回扫描和分析的结果
*/
-(``void``)getScanResultFromImage:(UIImage *)image completion:(``void` `(^)(SCPaperAnalysiserResult *result))completion;
/*! @brief 结束扫描和分析流程
*/
-(``void``)closeSession:(SCPaperAnalysiserResult * _Nullable)result;

错误描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//图片错误
codes.put(CODE_IMAGE_ERROR, "图片错误");
//未知错误
codes.put(CODE_ERROR, "未知错误");
//抠图成功
codes.put(CODE_0, "抠图成功");
//没有试纸;错误提示文案:没有找到试纸
codes.put(CODE_1, "没有找到试纸");
//距离过远;错误提示文案:距离过远,请调整拍摄距离
codes.put(CODE_2, "距离过远,请调整拍摄距离");
// 背景过脏;错误提示文案:背景有干扰,请在浅色纯背景下拍摄
codes.put(CODE_3, "背景有干扰,请在浅色纯背景下拍摄");
// 距离过近;错误提示文案:距离过近,请调整拍摄距离
codes.put(CODE_4, "距离过近,请调整拍摄距离");
//有残缺;错误提示文案:试纸不全,请保持全部试纸处在取景框内
codes.put(CODE_5, "试纸不全,请保持全部试纸处在取景框内");
// 神经网络处理错误;错误提示文案:算法处理中,请稍候
codes.put(CODE_6, "算法处理中,请稍候");
// 两张试纸;错误提示文案:一次只能拍摄一张试纸
codes.put(CODE_7, "一次只能拍摄一张试纸");
// 曝光不足;错误提示文案:光线太暗,请调整光线或打开闪光灯后拍摄
codes.put(CODE_8, "光线太暗,请调整光线或打开闪光灯后拍摄");
// 曝光过度;错误提示文案:光线太强,请调整光线或关掉闪光灯后拍摄
codes.put(CODE_9, "光线太强,请调整光线或关掉闪光灯后拍摄");
// 试纸局部过度曝光;错误提示文案:局部光线太强,请调整光线或关掉闪光灯后拍摄
codes.put(CODE_10, "局部光线太强,请调整光线或关掉闪光灯后拍摄");
// 画面模糊;错误提示文案:画面模糊,请保持手机稳定或重新对焦
codes.put(CODE_11, "画面模糊,请保持手机稳定或重新对焦");
// 曝光不足;错误提示文案:光线太暗,请调整光线或打开闪光灯后拍摄
codes.put(CODE_12, "光线太暗,请调整光线或打开闪光灯后拍摄");
//视频流扫描超时
codes.put(CODE_17, "视频流扫描超时");
/// 手动裁剪失败,请检查传入的图片和坐标点
codes.put(CODE_50, "手动裁剪失败,请检查传入的图片和坐标点");
//抠图成功,分析成功,但是用户取消确认抠图和分析结果。
codes.put(CODE_201, "用户取消");
//抠图成功,分析成功,但未检测到参考线,请确认试纸有参考线显示
codes.put(CODE_202, "未检测到参考线,请确认试纸有参考线显示");
//抠图成功,但是分析失败
codes.put(CODE_101, "试纸分析出错");
//SDK 校验失败或无效
codes.put(CODE_SDK_ERROR, "SDK 校验失败或无效");
//网络错误
codes.put(CODE_NET_ERROR, "网络错误");
codes.put(CODE_501, "缺少相关参数");
codes.put(CODE_503, "频率过高,关入小黑屋");
codes.put(CODE_500, "认证错误");
codes.put(CODE_502, "超时,认证无效");
codes.put(CODE_301, "参数不合法");
codes.put(CODE_302, "分析结果转化json出错");
codes.put(CODE_303, "分析失败,服务返回");
codes.put(CODE_304, "图片base64编解码失败");
codes.put(CODE_510, "分析失败");
codes.put(CODE_511, "试纸无效");

通过AiCode.getMessage(CODE)获取错误描述

如何debug

  • log tag:paper-analysis-log
  • log默认路径:context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)+”/log.txt”
  • 可以自定义log保存路径:new Config.Builder().logFilePath()

术语说明

N/A

Q&A

待完善…