通信连接组件
目录:
Activity启动器
使用启动Activity
方法启动一个Activity(活动)的组件。
可启动的Activity包括:
-
为 Android 应用启动另一个 App Inventor。 首先通过下载源代码并使用文件资源管理器或解压缩utility,找到一个名为“youngandroidproject/project.properties”的文件,找出另一个程序的的类。
文件的第一行将开始使用“main=”并后跟类名。 例如:
main=com.gmail.Bitdiddle.Ben.HelloPurr.Screen1
(第一个组件表明它是由 Ben.Bitdiddle@gmail.com 创建)要让您的Activity启动器
启动此应用程序,设置以下属性:ActivityPackage
到类名,删除最后一个组件(例如:com.gmail.Bitdiddle.Ben.HelloPurr
)ActivityClass
到整个类名(例如:com.gmail.Bitdiddle.Ben.HelloPurr.Screen1
)
- 通过设置以下属性启动相机应用程序:
Action
:android.intent.action.MAIN
ActivityPackage
:com.android.camera
ActivityClass
:com.android.camera.Camera
- 执行网络搜索。 假设您要搜索的词是“vampire”(您可以随意替换自己的选择),将属性设置为:
Action
:android.intent.action.WEB_SEARCH
ExtraKey
:query
ExtraValue
:vampire
ActivityPackage
:com.google.android.providers.enhancedgooglesearch
ActivityClass
:com.google.android.providers.enhancedgooglesearch.Launcher
- 打开浏览器到指定的网页。 假设您要访问的页面是“www.fun123.cn”(您可以随意替换自己的选择),将属性设置为:
Action
:android.intent.action.VIEW
DataUri
:http://www.fun123.cn
- 调用第三方地图也可以使用这个启动器:
- 调用高德地图的uri参考地址:https://lbs.amap.com/api/uri-api/guide/mobile-web/point/#point-on-lnglat
- 调用百度地图的uri参考地址:https://lbsyun.baidu.com/index.php?title=uri/api/web
- 打开系统照相机(比照相机组件打开的界面会丰富一些)
Action
:android.media.action.STILL_IMAGE_CAMERA
- 可选取多个文件(图片、音频、视频等):
Action
:android.intent.action.GET_CONTENT
更多有关Activity启动器使用技巧请查看《Activity启动器如何查看并启动其他App》。
属性
- Action
- 指定将用于启动Activity活动的操作。
- Activity类名
- 指定将启动的特定组件的Class类部分。
- Activity包名
- 指定将启动的特定组件的包部分。
- 数据类型
- 指定要传递给Activity活动的 MIME 类型。
- 数据URI
- 指定将用于启动Activity活动的数据URI。
- ExtraKey
- 指定将传递给Activity活动的额外键。(已过时,应使用 Extras)
- ExtraValue
- 指定将传递给Activity活动的额外值。(已过时,应使用 Extras)
- Extras
- 返回将作为额外数据传递给Activity活动的键值对列表。
- 结果
- 返回Activity活动的结果。
- 结果名称
- 指定一个名称,用于从Activity活动中获取结果。
- 结果类型
- 从Activity活动中返回的结果 MIME 类型。
- 结果URI地址
- 从Activity活动中返回的结果URI。
事件
- 取消活动调用()
- 如果此
Activity启动器
因为Activity活动被取消而返回,则引发该事件。 - 活动调用结束(result)
- 此
Activity启动器
返回后触发的事件。
方法
- 处理活动信息()
- 返回与此
Activity启动器
对应的Activity活动名称,如果找不到相应的Activity活动,则为空字符串。 - 启动活动对象()
- 启动这个
Activity启动器
对应的Activity活动。
蓝牙客户端
使用 蓝牙客户端
通过蓝牙将您的设备连接到其他设备。这个组件使用串行端口配置文件 (SPP) 进行通信。
如果您有兴趣使用低能耗蓝牙,请查看《App Inventor 2 低功耗蓝牙(BLE) 硬件接入、数据通信及IO控制》。
如果您希望了解经典蓝牙与BLE之间的区别,请查看《低功耗蓝牙(BLE) 和 经典蓝牙(SPP) 的区别》。
属性
- 地址及名称
- 返回配对的蓝牙设备列表,返回的列表每个元素都是一个字符串,由设备地址、一个空格和设备的名称组成。
蓝牙设备列表为空?
你可能没有开启AI伴侣或编译后App的发现蓝牙权限,这里以AI伴侣为例,勾上即可:
需要过滤蓝牙设备列表?
- 可用状态
- 如果设备上有蓝牙功能,则返回
真
,否则返回假
。 - 字符编码
- 返回发送和接收文本时使用的字符集编码(如GBK,UTF-8)。
- 分隔符字节码
- 调用 ReceiveText、ReceiveSignedBytes 或 ReceiveUnsignedBytes 返回传递负数时使用的分隔符字节码。
- 错误时断开连接
- 指定 蓝牙客户端/蓝牙服务器 是否在发生错误时自动断开连接。
- 启用
- 如果启用了蓝牙,返回
真
,否则返回假
。 - 高位优先
- 指定发送和接收数字时是否使用最高有效位字节优先。
- 是否已连接
- 如果已建立与蓝牙设备的连接,则返回
真
。 - 轮询率
- 返回蓝牙客户端配置的轮询速率值。
- 启用安全连接
- 指定是否启用安全连接。
事件
无
中文网注:
蓝牙客户端没有“当收到数据时”的事件(即收到服务端数据后触发的事件),只能通过定时器定期轮询接收数据,可以考虑使用BluetoothLE低功耗蓝牙拓展,它拥有这个事件。
方法
- 获取接收字节数()
- 返回输入流中可用的字节数。
- 连接(地址)
- 连接到指定地址的蓝牙设备。
连接报错? Runtime Error: Need android.permission.BLUETOOTH_CONNECT …
这时需要请求蓝牙连接权限,参考代码如下:
- 连接指定设备(地址,唯一编号)
- 连接到指定地址和UUID的蓝牙设备。
- 断开连接()
- 断开已连接的蓝牙设备。
- 检查设备是否配对(地址)
- 检查指定地址的蓝牙设备是否已配对。
- 接收单字节带符号数字()
- 读取带符号的 1 字节数字。
- 接收双字节带符号数字()
- 读取带符号的 2 字节数字。
- 接收四字节带符号数字()
- 读取带符号的 4 字节数字。
- 接收带符号字节数组(字节数)
- 从输入流中读取指定数量(
字节数
)的带符号的字节,并将它们作为列表返回。如果
字节数
为负数,则读取到分隔符字节码(分隔符字节码属性指定的)为止,分隔符字节码包含在返回的列表中。 - 接收文本(字节数)
- 从输入流中读取指定数量(
字节数
)的带符号的字节,并将它们转换为文本。如果
字节数
为负数,则读取到分隔符字节码(分隔符字节码属性指定的)为止。 - 接收单字节无符号数字()
- 读取一个无符号的 1 字节数字。
- 接收双字节无符号数字()
- 读取一个无符号的 2 字节数字。
- 接收四字节无符号数字()
- 读取一个无符号的 4 字节数字。
- 接收无符号字节数组(字节数)
- 从输入流中读取指定数量(
字节数
)的无符号的字节,并将它们作为列表返回。如果
字节数
为负数,则读取到分隔符字节码(分隔符字节码属性指定的)为止,分隔符字节码包含在返回的列表中。 - 发送单字节数字(数值)
- 将指定的
数值
字符串转换成整数,并将其作为 1 个字节写入到输出流。如果
数值
无法转换为整数,或转换的整数 1 个字节不够表达,将触发屏幕的 出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。 - 发送双字节数字(数值)
- 将指定的
数值
字符串转换成整数,并将其作为 2 个字节写入到输出流。如果
数值
无法转换为整数,或转换的整数 2 个字节不够表达,将触发屏幕的 出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。 - 发送四字节数字(数值)
- 将指定的
数值
字符串转换成整数,并将其作为 4 个字节写入到输出流。如果
数值
无法转换为整数,或转换的整数 4 个字节不够表达,将触发屏幕的 出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。 - 发送字节数组(列表)
- 从指定列表中取出每个元素,将其转换为字符串,字符串转换成整数,并将其作为 1 个字节写入到输出流。
如果一个元素无法转换为整数,或转换的整数 1 个字节不够表达,将触发屏幕的 出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。
- 发送文本(文本)
- 将指定文本转换为字节并将它们写入到输出流。
蓝牙服务器
使用 蓝牙服务器
组件将您的设备变成接收来自其他使用 蓝牙客户端
组件的应用程序连接的服务器。
属性
- 可用状态
- 如果设备上有蓝牙功能,则返回
真
,否则返回假
。 - 字符编码
- 返回发送和接收文本时使用的字符编码。
- 分隔符字节码
- 调用 ReceiveText、ReceiveSignedBytes 或 ReceiveUnsignedBytes 返回传递负数时使用的分隔符字节码。
- 启用
- 如果启用了蓝牙,返回
真
,否则返回假
。 - 高位优先
- 指定发送和接收数字时是否使用最高有效位字节优先。
- 接收状态
- 如果此
蓝牙服务器
组件正在接受一个传入连接,则返回真
。 - 连接状态
- 如果与蓝牙设备已建立连接,则返回
真
。 - 启用安全连接
- 指定是否启用安全连接。
事件
- 接受连接()
- 表示已接受蓝牙连接。
中文网注:
蓝牙服务端没有“当收到数据时”的事件(即收到客户端数据后触发的事件),只能通过定时器定期轮询接收数据,可以考虑使用BluetoothLE低功耗蓝牙拓展,它拥有这个事件。
方法
- 接受连接(服务名)
- 接受使用串行端口配置文件 (SPP) 进行通信的传入连接。
- 接受与指定设备连接(服务名,唯一编号)
- 接受指定 UUID 的传入连接。
- 获取接收字节数()
- 返回输入流中可用的字节数。
- 断开连接()
- 断开当前已连接的蓝牙设备。
- 接收单字节带符号数字()
- 读取带符号的 1 字节数字。
- 接收双字节带符号数字()
- 读取带符号的 2 字节数字。
- 接收四字节带符号数字()
- 读取带符号的 4 字节数字。
- 接收带符号字节数组(字节数)
- 从输入流中读取指定数量(
字节数
)的带符号的字节,并将它们作为列表返回。如果
字节数
为负数,则读取到分隔符字节码(分隔符字节码属性指定的)为止,分隔符字节码包含在返回的列表中。 - 接收文本(字节数)
- 从输入流中读取指定数量(
字节数
)的带符号的字节,并将它们转换为文本。如果
字节数
为负数,则读取到分隔符字节码(分隔符字节码属性指定的)为止。 - 接收单字节无符号数字()
- 读取一个无符号的 1 字节数字。
- 接收双字节无符号数字()
- 读取一个无符号的 2 字节数字。
- 接收四字节无符号数字()
- 读取一个无符号的 4 字节数字。
- 接收无符号字节数组(字节数)
- 从输入流中读取指定数量(
字节数
)的无符号的字节,并将它们作为列表返回。如果
字节数
为负数,则读取到分隔符字节码(分隔符字节码属性指定的)为止,分隔符字节码包含在返回的列表中。 - 发送单字节数字(数值)
- 将指定的
数值
字符串转换成整数,并将其作为 1 个字节写入到输出流。如果
数值
无法转换为整数,或转换的整数 1 个字节不够表达,将触发屏幕的 出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。 - 发送双字节数字(数值)
- 将指定的
数值
字符串转换成整数,并将其作为 2 个字节写入到输出流。如果
数值
无法转换为整数,或转换的整数 2 个字节不够表达,将触发屏幕的 出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。 - 发送四字节数字(数值)
- 将指定的
数值
字符串转换成整数,并将其作为 4 个字节写入到输出流。如果
数值
无法转换为整数,或转换的整数 4 个字节不够表达,将触发屏幕的 出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。 - 发送字节数组(列表)
- 从指定列表中取出每个元素,将其转换为字符串,字符串转换成整数,并将其作为 1 个字节写入到输出流。
如果一个元素无法转换为整数,或转换的整数 1 个字节不够表达,将触发屏幕的 出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。
- 发送文本(文本)
- 将指定文本转换为字节并将它们写入到输出流。
- 停止接受连接()
- 停止接受传入连接。
串口通信器
串口通信组件。手机串口通信案例请参考《App Inventor 2 串口组件:App使用OTG数据线进行串口通信》。
属性
- 波特率
- 返回当前波特率。
- 缓冲区大小
- 返回缓冲区大小(以字节为单位)
- 是否已初始化
- 当串口已初始化时返回
真
。 - 是否打开
- 当串口连接打开时返回
真
。
事件
无
方法
- 关闭串口()
- 关闭串口连接。关闭成功时返回
真
。 - 初始化串口()
- 初始化串口连接。
- 打开串口()
- 打开串口连接。 打开成功时返回
真
。 - 打印串口(data)
- 将给定数据写入串口,并在末尾添加一个新行。
- 读取串口()
- 从串口读取数据。
- 写入串口(data)
- 将给定数据写入串口。
Web客户端 示例
为 HTTP GET、POST、PUT 和 DELETE 请求提供功能的非可视组件。
属性
- 允许使用Cookies
- 指定是否允许使用Cookies。(Cookies是一种浏览器本地缓存技术,用于缓存一些用户个性数据、身份验证信息等。常见的如“30天免登陆”功能就是将用户登录验证信息保存到Cookies,有效期30天。还有诸如你的搜索偏好,浏览偏好等设置也是通过Cookies进行保存的)
- 请求标头
- 设置请求标头。以下是一个请求标头示例截图:
请求标头信息,格式为
包含双项子列表的列表
数据。其中,各子列表中第一项表示请求头的字段名,而第二项则表示对应的字段值,既可以是单个数值,也可以是包含多个数值的列表。设置案例如下:
有3种设置方式:
1、二维列表,非普通单列表:
2、键值对列表,非单个键值对:
3、完整字典,非单个键值对:
- 响应文件名称
- 指定保存响应数据的文件的名称,如果 保存响应信息 为
真
且 响应文件名称 为空,则自动创建一个新文件名。 - 保存响应信息
- 指定是否将响应数据保存到文件中。
- 超时时间(ms)
- 返回每个请求在超时前等待响应的毫秒数,如果设置为
0
,则请求将无限期等待响应。 - URL网址
- 指定待请求的URL网址.
事件
- 获得文件(URL网址,响应代码,响应类型,文件名)
- 当请求完成时触发该事件,以文件形式返回内容。
- 获得文本(URL网址,响应代码,响应类型,响应内容)
- 当请求完成时触发该事件,以文本形式返回内容。
- 超时(URL网址)
- 当请求超时触发该事件。
方法
- 创建数据请求(列表)
- 将表示名称和值对的二元素列表转换为
application/x-www-form-urlencoded
媒体类型格式的字符串,适合传递给执行POST文本请求。参考代码块如下:
- 清除Cookies()
- 清除此 Web客户端 组件的所有 Cookies。
- 删除()
- 使用 URL网址 属性执行 HTTP DELETE 请求并获取响应数据。
- 执行GET请求()
- 使用 URL网址 属性执行 HTTP GET 请求并获取响应数据。
- 解码HTML文本(HTML文本)
- 解码给定的 HTML 文本值。例如:
HTML字符 —> 解码后文本 &
&
<
<
>
>
'
'
(单引号)"
"
(双引号)&#xhhhh;
&#xhhhh;
&#nnnn;
&#nnnn;
- 编码JSON对象(JSON对象)
- 以 JavaScript 对象表示形式返回内置类型(即布尔值、数字、文本、列表、字典)的值。
- 解码JSON文本(JSON文本)
- 解码给定的 JSON 编码值以生成相应的 AppInventor 值。
JSON 列表
[x, y, z]
解码为列表(x y z)
,具有键 A 和值 B 的 JSON 对象(表示为{A:B}
)解码为列表(( A B))
,即包含二元素列表(A B)
的列表。如果你希望返回字典对象而不是结果中列表的列表,请使用方法 JSON文本解码为字典。
- JSON文本解码为字典(JSON文本)
- 解码给定的 JSON 编码值以生成相应的 App Inventor 值。
JSON 列表
[x, y, z]
解码为列表(x y z)
,具有名称 A 和值 B 的 JSON 对象(表示为 {a: b})解码为具有键 a 和值 b 的字典。 - 执行PATCH文件请求(文件路径)
- PATCH方式发送通用文件,用法类似 执行POST文件请求 。
- 执行PATCH文本请求(文本)
- 使用 URL网址 属性和指定文本执行 HTTP PATCH 请求。文本的字符集使用 UTF-8 进行编码。
- 执行PATCH编码文本请求(文本,编码)
- 使用 URL网址 属性和指定文本执行 HTTP PATCH 请求。文本的字符集使用指定的编码方式进行编码。
- 执行POST文件请求(文件路径)
- POST方式发送通用文件,同 curl -F 参数,可用于二进制文件上传,参考代码如下:
文件上传服务器结果如下:
服务器代码请参考《App Inventor 2 实现上传文件到服务器全方案总结》。
- 执行POST文本请求(文本)
- 使用 URL网址 属性和指定文本执行 HTTP POST 请求。文本的字符集使用 UTF-8 进行编码。
- 执行POST编码文本请求(文本,编码)
- 使用 URL网址 属性和指定文本执行 HTTP POST 请求。文本的字符集使用指定的编码方式进行编码。
- 执行PUT文件请求(文件路径)
- PUT方式发送通用文件,用法类似 执行POST文件请求 。
- 执行PUT文本请求(文本)
- 使用 URL网址 属性和指定文本执行 HTTP PUT 请求。文本的字符集使用 UTF-8 进行编码。
- 执行PUT编码文本请求(文本,编码)
- 使用 URL网址 属性和指定文本执行 HTTP PUT 请求。文本的字符集使用指定的编码方式进行编码。
- URI解码(文本)
- 对已编码的文本值进行URI解码操作,解码后的内容是原始的文本。如:
%E6%B8%B8%20%E6%88%8F
–解码–>游 戏
。 - URI编码(文本)
- 对给定的文本进行URI编码操作,编码后可用于URL网址。如:
游 戏
–编码–>%E6%B8%B8%20%E6%88%8F
。
- 空格不能用于URL网址中,需要编码成
%20
,中文也是一样,要编码成UTF-8格式。
- 解码XML文本(XML文本)
- 解码给定的 XML 字符串以生成列表对象。
<tag>string</tag>
解码为包含一个标签和字符串键值对的列表。更一般地,如果 obj1, obj2, … 是标记分隔的 XML 字符串,则
<tag>obj1 obj2 ...</tag>
解码为一个列表,其中包含第一个元素是 tag 且第二个元素的对 是已解码 obj 的列表,按标签按字母顺序排序。例如:
<foo>123</foo>
解码为包含一个键值对(foo 123)
的单项列表<foo>1 2 3</foo>
解码为包含一个键值对(foo "1 2 3")
的单项列表<a> <bar>456</bar> <foo>1 2 3</foo> </a>
解码为包含对(a X)
的列表,其中 X 是一个包含 2 项的列表,分别是键值对(bar 456)
和键值对(foo "1 2 3")
。
如果 obj 的序列混合了标记分隔和非标记分隔的项目,则非标记分隔的项目将从序列中拉出并用“content”标记包装。
例如
<a> <bar>456</bar> many <foo>1 2 3</foo> apples<a> </code>
解码与上面类似,除了列表 X 是一个 3项 包含额外键值对的项目列表,其第一项是字符串 “content”,第二项是列表 (many, apples)。如果结果不是格式良好的 XML,此方法会发出错误信号并返回空列表。
- XML文本解码为字典(XML文本)
- 解码给定的 XML 字符串以生成字典对象。
该字典包括特殊键
$tag
,$localName
,$namespace
,$namespaceUri
,$attributes
, 和$content
,以及指向与此处描述的结构相同的元素列表的每个节点的唯一标签。$tag
键是完整的标签名称,例如 foo:bar。$localName
是名称的本地部分(:
字符之后的所有内容)。如果给出了命名空间(:
字符之前的所有内容),则在$namespace
中提供该命名空间,并在$namespaceUri
中给出相应的 URI。 属性存储在$attributes
的字典中,子节点以列表形式给出在$content
下。有关特殊Keys的更多信息
给出以下 XML 文档:
<ex:Book xmlns:ex="http://example.com/"> <ex:title xml:lang="en">On the Origin of Species</ex:title> <ex:author>Charles Darwin</ex:author> </ex:Book>
解析时:
-
$tag
键将是"ex:Book"
-
$localName
键将是"Book"
-
$namespace
键将是"ex"
-
$namespaceUri
将是"http://example.com/"
-
$attributes
键将是一个字典{}
(命名空间中删除了 xmlns) -
$content
将是一个列表,包含解码后的<ex:title>
和<ex:author>
元素的两个项,第一项对应于<ex:title>
元素,将有一个包含字典{"xml:lang": "en"}
的$attributes
键。
对于元素上的每个
name=value
属性,将name
映射到value
的键值对将存在于$attributes
字典中。除了这些特殊键之外,还有
ex:title
和ex:author
,以允许比遍历$content
列表更快的查找速度。 -
SimpleBase64 拓展
SimpleBase64.aix 拓展下载:
SimpleBase64 demo程序下载:
提供图像的Base64编码及解码方法,便于图像文件的通信传输。此插件仅提供2个函数,使用非常方便,几乎没有学习成本。
属性
无
事件
无
方法
- EncodeImage
- DecodeImage
典型用法
图片缩放并Base64化,代码块如下:
(注:图片可拖动至编程区,自动还原代码块)
其中,用到的TaifunImage拓展
,点此查看。
参考用法如下:
ClientSocketAI2Ext 拓展
提供套接字(Socket)客户端连接功能。此版本由App Inventor 2 中文网(https://www.fun123.cn)维护并升级新特性。
该拓展提供TCP/IP协议接入功能,作为网络客户端连接TCP服务器,进行数据通信(发送/接收)。
原版拓展名称为:com.gmail.at.moicjarod.aix
,是能用的,但是有缺陷且不再更新了,目前已知问题:
-
没有做全局的异常处理,任何报错后(比如TCP服务器不通),App直接崩溃,没得选择,体验不好!
-
没有发送二进制数据的方法。(中文网已支持,内测中,待发布)
因此中文网在此基础上进行了特性升级,保留原版所有功能,部分方法进行优化体验,增加新的特性等。
改进后的拓展连接出错后,使用对话框组件个性展示出错信息,App仍然能够正常运行:
注:由于此拓展编译自最新的平台源码,经过测试,AI伴侣 < 2.67 或安卓 < 13的平台不支持,不兼容拓展的报错模板。
经测试某社区版(v2.65)不兼容,App直接崩溃;MIT 原版完美运行!
测试方法
点此下载测试工具,启动后提供TCP服务器功能,可与App进行双向通信功能测试:
测试连接代码块:
报错处理代码块:
拓展下载
.aix 拓展下载:
cn.fun123.ClientSocketAI2Ext.aix
demo程序下载:
属性
- serverAddress (R/W)
- serverPort (R/W)
- timeoutms (R/W)
- hexaStringMode (R/W)
- connectionState (RO)
- debugMessages (RW)
事件
- Connect
- Disconnect
- SendData
方法
- DataReceived
- RemoteConnectionClosed
发送文本消息时,hexaStringMode
设为 false;发送16制消息时,hexaStringMode
设为 true,例如:0x012 —> “303132” 字符串发送,接收的数据也是16进制字符串。
连接的超时时间默认是 2000 毫秒,可以设置修改。
原版其他已知问题:
-
消息不能超过 1024 字节。
-
如果与服务器的连接丢失(不是服务器关闭,而是 wifi 连接问题),则不会有任何事件触发(但崩溃现已修复)。
有关 ClientSocketAI2Ext 拓展问题,点此参与讨论。