高级JSON表单规范 - 第六章:捕获小部件





5.00/5 (2投票s)
JSON表单规范。
章节
- 第 1 章:引言
- 第 2 章:输入小部件
- 第 3 章:输入列表小部件
- 第 4 章:选项小部件
- 第 5 章:选项列表小部件
- 第 6 章:捕获小部件
- 第 7 章:日期和时间小部件
- 第 8 章:高级表单功能
引言
本章介绍表单屏幕,这些屏幕统称为捕获屏幕。捕获屏幕允许用户拍照、收集签名、扫描条形码或收集位置坐标信息。
按照本文前5章的传统,强烈建议读者下载、解压缩并将捕获控件表单复制到Android设备上。读者应使用CCA-Mobile应用程序完成此表单的一个实例。表单完成后,用户应将表单备份到设备上。备份的实例应与下面代码块中的内容大致相似。
/*
{
"Any Photo": {
"fileName": "cca_photo_06730794-a5d4-4753-bc72-d8f94da57b71.jpg"
},
"Car Photo": {
"fileName": "cca_photo_d6e20a4e-e89f-46cb-b687-dd0aa57b9846.jpg"
},
"My Sig": {
"fileName": "cca_signature_7a016a3a-5cb5-43fb-9e03-c9797119a98f.jpeg"
},
"QR Scan": "Advanced JSON Forms",
"My Location": {
"latitude": 51.500083,
"longitude": -0.126182,
"altitude": 19.097,
"accuracy": 4.90000009536743,
"bearing": 27.179992675781,
"provider": "gps"
}
}
*/
图像捕获和标注屏幕
理想情况下,照片捕获屏幕应允许用户使用设备的相机捕获图像,或从设备的存储中添加照片。
上图左侧显示了一个照片表单捕获屏幕的示例,右侧显示了捕获或添加图像到表单后的同一屏幕。
下面的代码块显示了上述屏幕的JSON定义。
/*
{
"mainScreen": {
"screenID": "Any Photo",
"screenDisplayArray": [
{
"localeCode": "en",
"screenLabel": "1. Take a photo of an object
",
"screenHint": "Any object would do
"
}],
"screenwidgetType": "photo",
"inputRequired": true,
"widgetSchema": "
\"Any Photo\": {
\"type\": \"object\",
\"properties\": {
\"fileName\": {
\"type\": \"string\"
},
\"filePath\": {
\"type\": \"string\"
},
\"fileObject\": {
\"type\": \"string\"
}
},
\"required\": [\"fileName\"],
\"minProperties\": 1,
\"maxProperties\": 4,
\"additionalProperties\": false
}"
}
}
*/
读者可以在上面的代码块中看到screenwidgetType
设置为photo
。
对于照片捕获屏幕,widgetSchema
的值是一个JSON对象,该对象至少包含三个属性:fileName
、filePath
和fileObject
。在这三个属性中,只有fileName
属性是照片屏幕输入的实例所必需或强制的。如果存在,filePath
string
属性包含图像文件的统一资源标识符(URI)。此外,如果存在,fileObject
属性以其base-64编码格式包含图像文件的二进制表示。
请注意,maxProperties
设置为4
,这表明存在第四个属性。这个第四个属性将在下一个屏幕中讨论。
代码块显示了完成的照片屏幕的JSON格式实例。
/*
{
"Any Photo": {
"fileName": "cca_photo_06730794-a5d4-4753-bc72-d8f94da57b71.jpg"
},
...
}
*/
照片表单屏幕还允许图像标注,如下面的示例屏幕所示。
为了允许图像标注,在其他三个属性(filePath
、fileName
和fileObject
)之外,还添加了一个名为annotate
的第四个属性,其默认值为true
,如以下代码块的widgetSchema
所示。
/*
{
"mainScreen": {
"screenID": "Car Photo",
"screenDisplayArray": [
{
"localeCode": "en",
"screenLabel": "2. Take a photo of a car
",
"screenHint": "Click on the photo and circle the wheels on the car
"
}],
"screenwidgetType": "photo",
"inputRequired": true,
"widgetSchema": "
\"Car Photo\": {
\"type\": \"object\",
\"properties\": {
\"fileName\": {
\"type\": \"string\"
},
\"filePath\": {
\"type\": \"string\"
},
\"fileObject\": {
\"type\": \"string\"
},
\"annotate\": {
\"type\": \"boolean\",
\"default\": true
}
},
\"required\": [\"fileName\"],
\"minProperties\": 1,
\"maxProperties\": 4,
\"additionalProperties\": false
}"
}
}
*/
下面是Car Photo
表单屏幕的已完成实例。
/*
{
...,
"Car Photo": {
"fileName": "cca_photo_d6e20a4e-e89f-46cb-b687-dd0aa57b9846.jpg"
},
...
}
*/
签名板屏幕
签名捕获屏幕在点击按钮时会显示一个板,可以在上面涂写签名,如下面的图片所示。
捕获的签名将作为图像保存到设备上。由于签名以图像形式捕获,签名屏幕的定义与照片捕获屏幕类似,只有两个区别:第一个是screenwidgetType
设置为signature
,第二个是widgetSchema
中定义的模式只允许3个属性,如下面的示例所示。
/*
{
"mainScreen": {
"screenID": "My Sig",
"screenDisplayArray": [
{
"localeCode": "en",
"screenLabel": "3. Please enter you signature
",
"screenHint": "Click on the button below to sign
"
}],
"screenwidgetType": "signature",
"inputRequired": true,
"widgetSchema": "
\"My Sig\": {
\"type\": \"object\",
\"properties\": {
\"fileName\": {
\"type\": \"string\"
},
\"filePath\": {
\"type\": \"string\"
},
\"fileObject\": {
\"type\": \"string\"
}
},
\"required\": [\"fileName\"],
\"minProperties\": 1,
\"maxProperties\": 3,
\"additionalProperties\": false
}"
}
}
*/
下面是一个已完成的签名屏幕实例的示例。
/*
{
...,
"My Sig": {
"fileName": "cca_signature_7a016a3a-5cb5-43fb-9e03-c9797119a98f.jpeg"
},
...
}
*/
代码扫描屏幕
代码扫描屏幕使用设备的数码相机扫描/读取条形码。下面的图片显示了代码扫描屏幕在扫描代码之前和之后的样子。
值得一提的是,CCA-Mobile应用程序依赖于ZXing库来实现代码扫描功能。
下面代码块显示了一个示例代码扫描屏幕的JSON定义。
/*
{
"mainScreen": {
"screenID": "QR Scan",
"screenDisplayArray": [
{
"localeCode": "en",
"screenLabel": "4. Click the button to scan any QR code
",
"screenHint": "Make sure your surroundings are adequately lit.
"
}],
"screenwidgetType": "codeScan",
"inputRequired": true,
"widgetSchema": "
\"QR Scan\": {
\"type\": \"string\"
}"
}
}
*/
screenwidgetType
设置为codeScan
,widgetSchema
值是一个转义的JSON字符串模式,该模式包含扫描内容的文本。
下面是此屏幕已完成实例的示例。
/*
{
...,
"QR Scan": "Advanced JSON Forms",
...
}
*/
位置屏幕
位置屏幕用于读取设备的当前物理位置的经度和纬度等值。位置值可以来自设备上的嵌入式GPS芯片,从移动或WIFI网络读取,等等。下面是此类屏幕渲染的示例。
如以下代码块所示,screenwidgetType
设置为location
。
/*
{
"mainScreen": {
"screenID": "My Location",
"screenDisplayArray": [
{
"localeCode": "en",
"screenLabel": "5. Click on the button to capture your current location.
",
"screenHint": "Make sure you can see the sky above you.
"
}],
"screenwidgetType": "location",
"inputRequired": true,
"widgetSchema": "
\"My Location\": {
\"type\": \"object\",
\"properties\": {
\"longitude\": {
\"type\": \"number\"
},
\"latitude\": {
\"type\": \"number\"
},
\"altitude\": {
\"type\": \"number\"
},
\"accuracy\": {
\"type\": \"number\",
\"maximum\": 5
},
\"bearing\": {
\"type\": \"number\",
\"default\": 0
},
\"provider\": {
\"type\": \"string\"
}
},
\"required\": [\"longitude\", \"latitude\", \"altitude\",
\"accuracy\", \"bearing\", \"provider\"]
}"
}
}
*/
widgetSchema
值是一个JSON对象的转义模式——在本例中是My Location
——该对象有6个属性,即longitude
、latitude
、altitude
、accuracy
、bearing
和provider
。所有这些属性的值都是必需的。
请注意,accuracy
属性的模式允许的最大值为5。这意味着只有accuracy
值小于等于5米的定位值才被接受为该示例表单屏幕的有效输入。最大accuracy
值可以根据表单设计者的要求而变化。provider属性值指示了读取位置值的来源,例如GPS、移动网络、WIFI网络等。
下面是此屏幕已完成实例的示例。
/*
{
...,
"My Location": {
"latitude": 51.500083,
"longitude": -0.126182,
"altitude": 19.097,
"accuracy": 4.90000009536743,
"bearing": 27.179992675781,
"provider": "gps"
}
}
*/
正在进行的工作
值得一提的是,还存在另外两种捕获屏幕,即视频和音频录制屏幕,在本章中未予演示。这些屏幕的定义尚未完成,因为其中一些参数目前尚未得到充分理解。例如,视频/音频录制屏幕应具有定义允许的录制时长和质量、录制格式等的参数或约束。目前尚不清楚如何定义这些参数,因此很难给出这些屏幕的精确定义。一旦完成,本章将进行更新。在此之前,请参阅以下代码块中的基本JSON定义。
/*
{
"mainScreen": {
"screenID": "Any Audio",
"screenDisplayArray": [
{
"localeCode": "en",
"screenLabel": "1. Record an audio of your favourite Cold Play song",
"screenHint": "Thank you very much :)"
}],
"screenwidgetType": "audio",
"inputRequired": true,
"widgetSchema": "
\"Any Audio\": {
\"type\": \"object\",
\"properties\": {
\"fileName\": {
\"type\": \"string\"
},
\"filePath\": {
\"type\": \"string\"
},
\"fileObject\": {
\"type\": \"string\"
}
},
\"required\": [\"fileName\"],
\"minProperties\": 1,
\"maxProperties\": 3,
\"additionalProperties\": false
}"
}
}
*/
/*
{
"mainScreen": {
"screenID": "Any Video",
"screenDisplayArray": [
{
"localeCode": "en",
"screenLabel": "1. Record a video of your best dance moves",
"screenHint": "C'mon, do it for the vine :)"
}],
"screenwidgetType": "video",
"inputRequired": true,
"widgetSchema": "
\"Any Video\": {
\"type\": \"object\",
\"properties\": {
\"fileName\": {
\"type\": \"string\"
},
\"filePath\": {
\"type\": \"string\"
},
\"fileObject\": {
\"type\": \"string\"
}
},
\"required\": [\"fileName\"],
\"minProperties\": 1,
\"maxProperties\": 3,
\"additionalProperties\": false
}"
}
}
*/
下一章
- 第7章讨论日期和时间收集屏幕。
看点
有兴趣的读者应遵循这些演练中的表单设计部分,并使用此GUI工具来了解更多关于基于多种用例场景设计表单的信息。
历史
- 2016 年 7 月 18 日:第一个版本
- 2016 年 11 月 3 日:对此工作进行了更正