除上述接口外Chrome应用还有其他各类丰富的接口,在本章将对其他的接口做以介绍。
10.1操作USB设备
通过usb接口可以与USB设备进行交互,这能让Chrome应用作为USB设备的驱动程序。要使用usb接口需要在Manifest中声明usb权限:
"permissions": [ "usb" ]
本章内容参考自https://crxdoc-zh.appspot.com/apps/usb。
10.2发现设备
列出指定的USB设备:
var options = { vendorId: 0x05ac, //Apple, Inc. productId: 0x12a0 //iPhone 4s }; chrome.usb.getDevices(options, function(deviceArray){ //do something with deviceArray; });
请求访问操作系统占用的设备(仅限Chrome OS):
chrome.usb.requestAccess(device, interfaceId, function(sucess){ //sucess is boolean });
其中interfaceId为接口标识符。
打开设备:
chrome.usb.openDevice(device, function(ConnectionHandle){ //do something with handle });
ConnectionHandle为连接句柄,包括三个属性,handle、vendorId和productId,其中handle为连接句柄的标识符。
寻找指定的USB设备(如果权限允许的话同时打开设备以便使用):
var options = { vendorId: 0x05ac, //Apple, Inc. productId: 0x12a0 //iPhone 4s interfaceId: null //only for Chrome OS }; chrome.usb.findDevices(options, function(ConnectionHandleArray){ //do something with ConnectionHandleArray });
关闭连接句柄:
chrome.usb.closeDevice(ConnectionHandle, function(){ //do something after close a device });
重置USB设备:
chrome.usb.resetDevice(ConnectionHandle, function(result){ //result is boolean });
10.1.2操作接口
列举USB设备上的所有接口:
chrome.usb.listInterfaces(ConnectionHandle, function(descriptorsArray){ //do something with descriptorsArray });
descriptorsArray是一个包含多个descriptors对象的数组,descriptors包含的属性有interfaceNumber、alternateSetting、interfaceClass、interfaceSubclass、interfaceProtocol、description和endpoints。endpoints也是一个数组,每个对象包含的属性有address、type、direction、maximumPacketSize、synchronization、usage和pollingInterval。
在指定USB设备上获取接口:
chrome.usb.claimInterface(ConnectionHandle, interfaceNumber, function(){ //do something after the interface is claimed });
释放在提供的设备上获取的接口:
chrome.usb.releaseInterface(ConnectionHandle, interfaceNumber, function(){ //do something after the interface is released });
在之前获取的设备接口上选择替代的设置:
chrome.usb.setInterfaceAlternateSetting(ConnectionHandle, interfaceNumber, alternateSetting, function(){ //do something after the interface setting is set });
alternateSetting为要设置的替代设置。
10.1.3操作传输
在指定设备上进行控制传输:
chrome.usb.controlTransfer(ConnectionHandle, transferInfo, function(info){ //do something with info });
其中transferInfo为对象,包含的属性有direction、recipient、requestType、request、value、index、length和data。如果输出数据,transferInfo.data必须指定,值的类型为ArrayBuffer。
info为对象,包含的属性有resultCode和data,resultCode为0时表示成功,data为传入数据,类型为ArrayBuffer。
在指定设备上进行大块传输:
chrome.usb.bulkTransfer(ConnectionHandle, transferInfo, function(info){ //do something with info });
transferInfo为对象,包含的属性有direction、endpoint、length和data。此方法返回的info类型与controlTransfer相同。
在指定设备上进行中断传输:
chrome.usb.interruptTransfer(ConnectionHandle, transferInfo, function(info){ //do something with info });
此方法各参数类型与bulkTransfer相同。
在指定设备上进行同步传输:
chrome.usb.isochronousTransfer(ConnectionHandle, transferInfo, function(info){ //do something with info });
此方法各参数类型与bulkTransfer相同。
10.2串口通信
通过serial接口可以使Chrome应用进行串口通信。使用serial接口需要在Manifest中声明serial权限:
"permissions": [ "serial" ]
本章内容参考自https://crxdoc-zh.appspot.com/apps/serial。
10.2.1建立连接
获取系统中可用串行设备的有关信息:
chrome.serial.getDevices(function(portsArray){ //do something with portsArray });
portsArray为包含多个ports的数组。每个ports是一个包含多个属性的对象,其属性有path、vendorId、productId和displayName。
连接到指定的串行端口:
chrome.serial.connect(path, options, function(connectionInfo){ //do something with connectionInfo });
其中options为端口配置选项,完整的结构如下:
{ persistent: 应用关闭时连接是否保持打开状态, name: 与连接相关联的字符串, bufferSize: 用于接收数据的缓冲区大小, bitrate: 打开连接时请求的比特率, dataBits: 默认为"eight", parityBit: 默认为"no", stopBits: 默认为"one", ctsFlowControl: 是否启用RTS/CTS硬件流控制, receiveTimeout: 等待新数据的最长时间,以毫秒为单位, sendTimeout: 等待send操作完成的最长时间,以毫秒为单位 }
更新打开的串行端口连接的选项设置:
chrome.serial.update(connectionId, options, function(result){ //result is boolean });
断开串行端口连接:
chrome.serial.disconnect(connectionId, function(result){ //result is boolean });
暂停或恢复打开的连接:
chrome.serial.setPaused(connectionId, paused, function(){ //do something after pause a connection });
10.2.2发送和接收数据
向指定连接写入数据:
chrome.serial.send(connectionId, data, function(sendInfo){ //do something with sendInfo });
sendInfo为一个包含两个属性的对象,分别为bytesSent和error。
清除指定连接输入输出缓存中的所有内容:
chrome.serial.flush(connectionId, function(result){ //result is boolean });
当接收到数据时,会触发onReceive事件:
chrome.serial.onReceive.addListener(function(info){ //do something with info });
info是一个包含两个属性的对象,分别是connectionId和data。
当发生错误时,会触发onReceiveError事件:
chrome.serial.onReceiveError.addListener(function(info){ //do something with info });
info为一个包含两个属性的对象,分别为connectionId和error。
10.2.3获取连接及状态
获取指定连接的状态:
chrome.serial.getInfo(connectionId, function(connectionInfo){ //do something with connectionInfo });
获取当前应用拥有并打开的串行端口连接列表:
chrome.serial.getConnections(function(connectionInfoArray){ //do something with connectionInfoArray });
获取指定连接上控制信号的状态:
chrome.serial.getControlSignals(connectionId, function(signals){ //do something with signals });
signals是一个包含4个属性的对象,分别是dcd、cts、ri和dsr。
设置指定连接上控制信号的状态:
chrome.serial.setControlSignals(connectionId, signals, function(result){ //result is boolean });
signals参数为一个包含两个属性的对象,分别是dtr和rts。
10.3文字转语音
使用tts接口可以将文字转换为语音,tts接口可以使用不同语速、音调阅读文字。文字转语音对视力不佳的用户来说非常重要。
要在应用中使用tts接口,需要在Manifest的permissions中声明tts权限:
"permissions": [ "tts" ]
10.3.1朗读文字
使用speak方法来朗读文字:
chrome.tts.speak('Hello, world.');
speak方法还可以指定朗读参数和回调函数:
chrome.tts.speak(utterance, options, callback);
回调函数callback会在speak方法调用成功后立刻执行,这意味着不会等到朗读结束后才调用callback。options指定了朗读时所采用的语调、语速、音量等等,options完整的结构如下所示:
{ enqueue: 是否将朗读任务放入队列,如果为true,此朗读任务将在之前的任务结束后才开始, voiceName: 朗读所使用的声音名称, extensionId: 为朗读提供声音引擎扩展的id, lang: 所朗读文字的语言, gender: 朗读声音所使用的性别,male或female, rate: 朗读语速,默认值为1.0,允许的值为0.1到10.0,但具体范围还要结合具体使用的声音,值越大速度越快, pitch: 朗读语调,默认值为1.0,允许的值为0到2.0, volume: 朗读音量,默认值为1.0,允许的值为0到1.0, requiredEventTypes: 声音必须支持的事件, desiredEventTypes: 需要监听的事件,如未指定则监听全部事件, onEvent: 用于监听事件的函数 }
如下面的例子,用美式英文以正常语速的2倍阅读“Hello, world.”:
chrome.tts.speak('Hello, world.', {lang: 'en-US', rate: 2.0});
而下一个例子会在“Speak this first.”阅读完毕后才阅读“Speak this next, when the first sentence is done.”:
chrome.tts.speak('Speak this first.'); chrome.tts.speak('Speak this next, when the first sentence is done.', {enqueue: true});
使用chrome.runtime.lastError来抓取tts接口使用中可能发生的错误:
chrome.tts.speak(utterance, options, function() { if (chrome.runtime.lastError) { console.log('Error: ' + chrome.runtime.lastError.message); } });
使用stop方法可以随时停止正在进行的朗读任务:
chrome.tts.stop();
使用pause方法可以随时暂停正在进行的朗读任务:
chrome.tts.pause();
使用resume方法可以随时恢复被暂停的朗读任务:
chrome.tts.resume();
10.3.2获取声音
通过getVoices方法可以获取到目前计算机中提供的声音:
chrome.tts.getVoices(function(voices){ //do something with voices });
返回的结果voices是一个包含多个声音对象的数组。声音对象包含6个属性,分别是voiceName、lang、gender、remote、extensionId和eventTypes,其中remote属性表示此声音是否为网络资源,eventTypes为此声音支持的全部事件。
如下面为一个声音对象的实例:
{ "eventTypes": [ "start", "end", "interrupted", "cancelled", "error" ], "extensionId": "neajdppkdcdipfabeoofebfddakdcjhd", "gender": "female", "lang": "en-GB", "remote": true, "voiceName": "Google UK English Female" }
获取到声音对象后,通过指定speak方法中的相应参数来应用声音,如:
chrome.tts.speak(utterance, { voiceName: 'Google UK English Female', lang: 'en-GB' }, callback);
10.3.3获取朗读状态及监听事件
如果当前应用正在朗读文本,执行一个新的朗读任务会立即停止之前的朗读任务。为了避免打断正在进行的朗读任务,可以通过isSpeaking方法获取当前的朗读状态:
chrome.tts.isSpeaking(function(isSpeaking){ //isSpeaking is boolean });
在10.3.1中提到speak参数的onEvent属性用来监听朗读事件:
chrome.tts.speak(utterance,{ onEvent: function(event) { console.log('Event ' + event.type ' at position ' + event.charIndex); if (event.type == 'error') { console.log('Error: ' + event.errorMessage); } } }, callback);
其中event对象包含三个属性,分别是type、charIndex和errorMessage。type为事件类型,可能的值包括start、end、word、sentence、marker、interrupted、cancelled、error、pause和resume。
朗读任务一开始就会监听到start类型事件,当朗读到一个新的词语时会监听到word类型事件,朗读完一个句子时会监听到sentence类型事件,当朗读任务被中断会监听到interrupted类型事件,而如果朗读任务尚未开始即被移除会监听到cancelled类型事件,error、pause和resume类型事件分别会在朗读过程中遇到错误、被暂停和被恢复时接收到。
对于marker类型事件,它是在朗读任务到达SSML标记时触发的,有关SSML的详细介绍请读者自行参考http://www.w3.org/TR/speech-synthesis/,此处不做详细介绍。
不过实际能接收到的类型事件需要根据具体选择的声音的支持情况,在10.3.2中获取到的声音对象eventTypes属性列出了相应声音支持的全部事件类型。
10.4系统信息
在讲解Chrome扩展时我们提到过获取CPU、内存和存储设备信息的方法,具体可以参见5.4节。Chrome应用也可以获取到系统信息,并且与Chrome扩展类似。
Chrome应用可以获取到的系统信息包括CPU、内存、存储设备、显示器和网卡。要获取信息,需要在Manifest中声明相应权限:
"permissions": [ "system.cpu", "system.memory", "system.storage", "system.display", "system.network" ]
由于CPU、内存和存储设备相关的内容已经在5.4节讲过了,所以本节只讲解显示器和网卡的内容。
通过chrome.system.display.getInfo方法可以获取到显示器相关信息:
chrome.system.display.getInfo(function(displayInfoArray){ //do something with displayInfoArray });
displayInfoArray是一个包含多个displayInfo对象的数组。displayInfo对象的完整结构如下:
{ id: 显示器的唯一id, name: 显示器名称,如HP LCD monitor, mirroringSourceId: 镜像的显示器id,目前只支持Chrome OS平台, isPrimary: 是否为主显示器, isInternal: 是否为笔记本的自带显示器, isEnabled: 是否被启用, dpiX: 显示器水平DPI, dpiY: 显示器垂直DPI, rotation: 显示器旋转角度,目前只支持Chrome OS平台, bounds: { left: 显示器逻辑范围左上角横坐标, top: 显示器逻辑范围左上角纵坐标, width: 显示器逻辑范围像素宽度, height: 显示器逻辑范围像素高度 }, overscan: { left: 显示范围距左边框的距离, top: 显示范围距上边框的距离, right: 显示范围距右边框的距离, bottom: 显示范围距下边框的距离 }, workArea: { left: 工作区范围左上角横坐标, top: 工作区范围左上角纵坐标, width: 工作区范围像素宽度, height: 工作区范围像素高度 } }
其中overscan属性目前只在Chrome OS平台有效,workArea的范围不包括系统占用部分,如任务栏等。
通过chrome.system.display.setDisplayProperties方法可以更改显示器设置,支持更改的属性包括mirroringSourceId、isPrimary、overscan、rotation、boundsOriginX和boundsOriginY。boundsOriginX和boundsOriginY对应于bounds.left和bounds.top,即显示器逻辑范围的原点坐标。
chrome.system.display.setDisplayProperties(id, info, function(){ //do something after set display properties });
通过chrome.system.display.onDisplayChanged监听显示器设置更改事件:
chrome.system.display.onDisplayChanged.addListener(function(){ //do something after display properties are changed });
通过chrome.system.network.getNetworkInterfaces方法可以获取到网卡信息:
chrome.system.network.getNetworkInterfaces(function(networkInterfaces){ //do something with networkInterfaces console.log(networkInterfaces); });
networkInterfaces是一个包含多个networkInterface对象的数组,networkInterface对象包含3个属性,分别是name、address和prefixLength。name为网卡的名称,在*nix系统上通常是eth0或wlan0等。address为网卡可用的IPv4或IPv6地址。prefixLength为前缀长度。
-----------------------------------------------------
转载请注明来源此处
原地址:#
发表