65.9K
CodeProject 正在变化。 阅读更多。
Home

如何构建基本的集成Gear应用程序

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.86/5 (8投票s)

2014年7月3日

公共领域

8分钟阅读

viewsIcon

31850

downloadIcon

419

本教程教开发者如何为三星配件协议 (SAP) 构建一个基本的示例应用程序。

引言

下面的教程教开发者如何为三星配件协议 (SAP) 构建一个基本的示例应用程序。这是一个三部分系列。它还教授如何使用模拟器测试应用程序。第一部分是关于 Android 端的开发。第二部分是关于 Tizen 端的开发。第三部分是关于 SAP 的完整应用程序,它基本上是 Android 部分和 Tizen 部分的打包。

Android 端的开发

Tizen 端的开发

现在我们将继续进行 SAP 应用程序的 Tizen 开发部分。如果您还没有创建您的 Android 应用程序部分,请参阅上面的视频。

让我们开始吧。首先,让我们打开 Tizen IDE for Wearable 并选择一个工作区。

请关闭“每日提示”。

然后让我们创建一个新项目。选择 文件 -> 新建 -> Tizen Wearable Web Project。

选择模板,基本,我将这个命名为“SimpleSAPConsumer”,这是 Android 应用程序示例 SAP Provider 的替代方案。这将是接收来自 Android 端通信的应用程序。

现在我们有了一个可以使用的项目,首先让我们修改 index.html 中的界面,并确保标题是“SAP Consumer”。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <meta name="description" content="Tizen Wearable basic template generated by Samsung Wearable Web IDE"/>

    <title>SAP Consumer</title>

    <link rel="stylesheet" type="text/css" href="css/style.css"/>
    <script src="js/main.js"></script>
</head>

并将此放入 UI 插槽中

  <div class="ui-title">SAP CONSUMER</div>
  <div>
  	<input type=button value="Connect" onclick="connect();" style="width: 32%; height: 60px; -webkit-tap-highlight-color: rgba(0,0,0,0);"/>
  	<input type=button value="Fetch" onclick="fetch();" style="width: 32%; height: 60px; -webkit-tap-highlight-color: rgba(0,0,0,0);"/>
  	<input type=button value="Disconnect" onclick="disconnect();" style="width: 32%; height: 60px; -webkit-tap-highlight-color: rgba(0,0,0,0);"/>
  </div>
  <div id="resultBoard">
	<!-- test -->
  </div>

所以我们有一个标题是“SAP Consumer”,以及三个按钮:ConnectFetchDisconnect,每个按钮都有一个函数,最后一个值是按钮的样式,而 <div id="resultBoard"> 将显示从 Android 设备接收到的所有通信消息。

接下来让我们添加脚本功能,所以打开 main.js。让我们添加四个变量。第一个变量是 SAAgent,它将镜像 Android 端的 SAAgent。让我们将其初始化为 null。还有一个 SASocket 变量,同样镜像 Android 端,也初始化为 null。还有一个 CHANNELID。确保将其初始化为与 Android 端相同的 CHANNELID。以及 ProviderAppName,您的 Provider Application 的名称是 Android 端应用程序的名称,所以对我们来说是“SimpleSAPProvider”。

var SAAgent = null;
var SASocket = null;
var CHANNELID = 123;
var tag = "SIMPLE SAP ";
var ProviderAppName = "SimpleSAPProvider";

接下来,让我们添加一个内容写入器。基本上,这个 createHTML 函数接受一个参数(log_string)并将其写入 index.html 对象引用的 resultBoard,并在那里添加日志。

function createHTML(log_string)
{
	var log = document.getElementById('resultBoard');
	log.innerHTML = log.innerHTML + "<br> : " + log_string;
}

接下来让我们添加另一个函数,这个函数是用于错误日志记录的,正如您所见,它会在控制台和您的 IDE 中记录错误。

function onerror(err) {
	console.log("ONERROR: err [" + err.name + "] msg[" + err.message + "]");
}

让我们为 agentCallback 添加一个变量。基本上,它的作用是负责连接到 Android 端并提醒您连接已建立。

var agentCallback = {
	onconnect : function(socket) {
		console.log( "agentCallback onconnect" + socket);
		SASocket = socket;
		alert("SAP Connection established with RemotePeer");
		createHTML("startConnection");
		SASocket.setSocketStatusListener(function(reason){
			console.log("Service connection lost, Reason : [" + reason + "]");
			disconnect();
		});
	},
	onerror : onerror
};

让我们为 AgentFindCallback 添加另一个变量。所以这个的作用是使用具有特定提供者应用程序名称的三星配件协议来定位 peer

var peerAgentFindCallback = {
	onpeeragentfound : function(peerAgent) {
		try {
			if (peerAgent.appName == ProviderAppName) {
				console.log(" peerAgentFindCallback::onpeeragentfound " + peerAgent.appname + " || " + ProviderAppName);
				SAAgent.setServiceConnectionListener(agentCallback);
				SAAgent.requestServiceConnection(peerAgent);
			} else {
				console.log(" peerAgentFindCallback::onpeeragentfound else");
				alert("Not expected app!! : " + peerAgent.appName);
			}
		} catch(err) {
			console.log(" peerAgentFindCallback::onpeeragentfound exception [" + err.name + "] msg[" + err.message + "]");
		}
	},
	onerror : onerror
}

让我们添加另一个名为 onsuccess 的函数来处理来自代理和对等方的连接成功响应。这是 onerror 的替代方案。

function onsuccess(agents) {
	try {
		if (agents.length > 0) {
			SAAgent = agents[0];
			
			SAAgent.setPeerAgentFindListener(peerAgentFindCallback);
			SAAgent.findPeerAgents();
			console.log(" onsuccess " + SAAgent.name);
		} else {
			alert("Not found SAAgent!!");
			console.log(" onsuccess else");
		}
	} catch(err) {
		console.log("onsuccess exception [" + err.name + "] msg[" + err.message + "]");
	}
}

现在让我们添加另一个函数来将结果写入我们的 HTML 板,onreceive,它接受 channelId 和数据。此函数将调用 createHTML 函数,该函数记录接收到的数据。这镜像了 Android 端应用程序的 onreceive 函数。

function onreceive(channelId, data) {
	createHTML(data);
}

现在让我们添加按钮方法。首先,connect()。所以正如您所见,if 语句检查 SASocket 是否已连接。如果是,则会显示一个提示,表明它已连接。如果不是,我们使用 webapiesSAAgent 请求连接,该连接会返回成功或错误。此外,还有一个日志用于捕获错误。

function connect() {
	if (SASocket) {
		alert('Already connected!');
        return false;
    }
	try {
		webapis.sa.requestSAAgent(onsuccess, onerror);
	} catch(err) {
		console.log("exception [" + err.name + "] msg[" + err.message + "]");
	}
}

接下来是 fetch() 方法,它从 Android 端获取数据。我们将数据发送到定义的 CHANNELID 和一个空字符串。

function fetch() {
	try {
		SASocket.setDataReceiveListener(onreceive);
		SASocket.sendData(CHANNELID, "");
	} catch(err) {
		console.log("exception [" + err.name + "] msg[" + err.message + "]");
	}

最后,最后一个按钮函数是 disconnect(),用于主动断开您的可穿戴设备和您的 Android 设备。所以在这个第一个 if 语句中,我们检查 SASocket 是否不为 null,然后控制台日志记录 DISCONNECT SASOCKET NOT NULL(当然),并主动向连接发送一个 close(SASocket.close();),否则就会出现错误。

function disconnect() {
	try {
		if (SASocket != null) {
			console.log(" DISCONNECT SASOCKET NOT NULL");
			SASocket.close();
			SASocket = null;
			createHTML("closeConnection");
		}
	} catch(err) {
		console.log(" DISCONNECT ERROR: exception [" + err.name + "] msg[" + err.message + "]");
	}
}

最后我们要添加的是一个脚本,以便我们能够关闭应用程序,并引用 tizenhwkey 的 close 函数。

}
window.onload = function () {
    document.addEventListener('tizenhwkey', function(e) {
        if(e.keyName == "back")
            tizen.application.getCurrentApplication().exit();
    });
};

如果您想为您的应用程序添加一些样式,请转到 style.css。例如,您可以将 background-color 更改为白色,或者可以为标题添加样式规则。在这种情况下,我们的标题将是蓝色的,字体大小为 24px,其余用于间距。

body {
    margin: 0px auto;
    background-color:white;
}

.ui-title {
  color: blue;
  font-size: 24px;
  white-space: nowrap;
  margin: 0px;
  padding-left: 16px;
  padding-right: 16px;
}

与 Android 端类似,我们也需要 Tizen 的元数据。您可以将其视为两种技术相遇的共同点。在项目文件夹中,右键单击并添加一个名为 res 的文件夹。在 res 内部,再添加一个名为 xml 的文件夹。正如您所看到的,这与 Android 端类似。

我们还将在此处添加一个 XML 文件。

记住您在 Android 端命名的 XML 文件名,对我来说是 sapservices.xml。如果它最初显示为不受支持的文件,没关系,我们将修改它。现在我们已经有了元数据 XML 文件,我们所要做的就是填充内容。

<resources>
    <application name="SimpleSAPConsumer">
        <serviceProfile 
            role="consumer" 
            name="sapimageswitcher" 
            serviceTimeout="10" 
            serviceLimit="ANY"
            version="2.0" 
            id="/system/sapimageswitcher">
            <supportedTransports>
                <transport type="TRANSPORT_WIFI"/>
            </supportedTransports>
            <serviceChannel 
               id="123" 
               reliability="enable" 
               priority="low" 
               dataRate="low"/>
        </serviceProfile>
    </application>
</resources>

现在我们有了工作元数据。剩下的是修改我们的 config.xml 文件。确保对我们创建的元数据有引用。在这种情况下,是 AccessoryServiceLocation。还要确保我们的 widget 有权限使用 accessoryprotocol。现在 config 文件已设置为 SAP 使用,这就是编码部分。

<?xml version="1.0" encoding="UTF-8"?>
<widget viewmodes="maximized" version="1.0.0" id="http://yourdomain/SimpleSAPConsumer" xmlns:tizen="http://tizen.org/ns/widgets" xmlns="http://www.w3.org/ns/widgets">
    <tizen:application id="HUbSOmFAGb.SimpleSAPConsumer" required_version="2.2" package="HUbSOmFAGb"/>
    <content src="index.html"/>
    <feature name="http://tizen.org/feature/screen.size.all"/>
    <icon src="icon.png"/>
    <tizen:metadata value="res/xml/sapservices.xml" key="AccessoryServicesLocation"/>
    <name>SimpleSAPConsumer</name>
    <tizen:privilege name="http://developer.samsung.com/privilege/accessoryprotocol"/>
</widget>

现在我们已经准备好一切,让我们构建项目。点击 项目 -> 构建项目。

这将生成一个 .wgt 文件。这是我们需要将其附加到 Android 端的文件。

打包集成应用程序

现在我们将集成 Android 和 Tizen,以及测试我们的应用程序。

让我们开始吧。现在我们有了 Android 和 Tizen 部分的应用程序,我们将首先打包应用程序。在您的 Tizen 应用程序中,会有一个扩展名为 .wgt 的文件。只需将其复制并粘贴到您的 Android 应用程序的 assets 文件夹中。原因是我们开发的应用程序是一种集成型应用程序,这意味着在 Android 设备上安装 SAP 服务的同时,应用程序也将同时安装到 Galaxy Gear 设备上。

现在我们有了一个打包的应用程序。让我们试试。在实际的 Galaxy Gear 设备上进行测试,并与 Android 设备配对,您只需要在 Android 设备上运行该应用程序,其余的将由 Gear Manager 应用程序完成。Gear Manager 应用程序是我们用于将 Galaxy Gear 设备与三星 Android 智能手机配对的应用程序,可以从三星应用商店下载。只有在您的 Galaxy Gear DUID 上注册了证书,您才能测试您在实际 Galaxy Gear 设备上创建的应用程序。

如果您没有具有实际设备 DUID 的证书,请不要担心,您可以注册一个具有模拟器 DUID 的证书,以便通过 USB 模拟 SAP 配对来测试您的应用程序。如果您的设备安装了 Gear Manager,请将其卸载,以及与 Gear Manager 相关的应用程序。

为了通过 USB 进行测试,我们将需要从下载的文件名“Applications for Emulator”中安装三个 APK。可以从 http://developer.samsung.com/samsung-gear 下载。请按此顺序安装

  1. SAccessoryService_Emul.apk
  2. SAFTCore_Emul.apk
  3. HostManagerForEmul.apk

现在您已经安装了它们,请注意,只有最后一个 APK 具有 UI。这是测试设备是否通过 USB 连接到模拟的 SAP 环境。接下来,让我们建立连接。确保只有一个 Android 设备通过 USB 连接。确保您知道可以调用 Android 调试桥的路径。您还需要 Tizen IDE for Wearable。确保它正在运行。

打开一个终端窗口,然后转到 adb 的位置。如果您尚未在环境变量中定义它,请键入

adb -d forward tcp:8230 tcp:8230

这将确保 SAP 通信被转发到您的 Android 设备。

在您的 Android 设备上运行 HostManagerForEmul。现在它应该显示“Disconnected”。在 Tizen IDE 中启动一个模拟的可穿戴设备,并等待它完全启动。

Android 设备上显示的文本现在应该显示“Connected”。

如果不起作用,请右键单击模拟器,单击“Shell”,然后键入

killall sap-server

这应该会停止模拟器中的服务。

现在我们已经建立了连接,首先运行 Android 应用程序,这将启动 Android 设备上的服务。

然后转到您的 Tizen IDE 并运行 Wearable 应用程序。我们应该有这个

现在您可以测试该应用程序了。继续单击 Connect,它应该会连接到您的实际 Android 设备。然后单击 OK 忽略提示。然后单击 Fetch 以获取制造商、手机型号,以及分钟和秒数。如果您想停止它,可以单击“Disconnect”。出于调试目的,您可以注意控制台中的日志。

© . All rights reserved.