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

使用 Xamarin 和 Visual Studio 入门 Android Wearable 开发

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (8投票s)

2016 年 6 月 10 日

CPOL

14分钟阅读

viewsIcon

37750

downloadIcon

385

一个一站式教程,帮助您开始在 Android 可穿戴设备和手持设备上构建应用。

引言

“可穿戴电子设备”和“可穿戴设备”都指的是电子技术或计算机,它们被集成到衣物和配饰中,可以舒适地佩戴在身上。例如 Google Glass 和智能手表。(来源:什么是可穿戴电子设备

我有机会研究了 Android 可穿戴电子设备,特别是智能手表,并决定出于以下原因使用 Xamarin 和 Visual Studio。

  • Xamarin 允许您使用 C# 构建跨平台应用程序(iOS、Android 和 Windows 应用)。
  • 我是一位经验丰富的 C# 开发人员。
  • 我更熟悉 Visual Studio 开发工具。
  • 由于我无需学习如何使用其他框架、编辑器、工具和其他编程语言来构建原生应用,因此学习曲线更小。
  • 我可以利用 Xamarin 提供的炫酷功能,例如云测试和应用监控。
  • Xamarin 和 Visual Studio 是构建真实应用非常流行且稳定的平台。

有机会与 Android 可穿戴设备合作非常令人兴奋,因为它们如今越来越受欢迎。是的,这很令人兴奋,但同时也很可怕,因为我对这项技术、智能手表设备和 Android 方面的经验不多。这意味着我需要从头开始学习这项技术和 Android 框架本身的所有工作原理。我也知道,由于使用这些技术与 Web 开发完全不同,因此存在一定的学习曲线。所以,我写这篇文章是为了指导像我一样的新手开始 Android Wear 应用开发。

您将学到什么

在本文中,您将学到以下内容

  • 设置开发环境
  • 创建一个简单的 Android Wear 应用
  • 创建可在可穿戴设备和 Android 手持设备之间同步数据的应用
  • 跨可穿戴设备和手持设备测试、调试和部署 Android 应用

设置开发环境

我们首先需要安装必要的工具。所以,您需要先安装 Visual Studio。如果您使用的是 Visual Studio 2010、2012 或 2013,请确保它是 Professional 版本或更高版本,因为 Visual Studio 的 Xamarin 扩展仅支持非 Express 版本。有关详细信息,请参阅 https://xamarin.com/faq

在我这里,我使用了 Visual Studio 2013 Ultimate 版本。安装了支持版本的 Visual Studio 后,请前往此处下载 Visual Studio 的 Xamarin 扩展 http://xamarin.com/visual-studio。(您可以从免费试用或许可版本开始。)

只需按照下载向导中的说明完成安装(请注意,这可能需要更长的时间,具体取决于您安装的框架)。您可能需要重新启动计算机才能使所有安装的内容生效。

现在,当您启动 Visual Studio 时,您应该能在“工具”菜单下看到以下项目。

图 1:Android 工具和 SDK

为确保您需要的一切都已安装,可以在 Android SDK 管理器中进行验证。只需转到“工具”>“Android”>“Android SDK 管理器”。这将打开下面的窗口

图 2:Android SDK 管理器

现在,如果您认为您需要的一切都已安装,那么恭喜您,您现在可以使用 Visual Studio 中的 Xamarin 开始创建自己的炫酷 Android 应用了。

创建一个简单的 Android Wear 应用

让我们继续在 Visual Studio 中创建一个新项目,然后从“模板”中选择“Android”>“Wear App (Android)”。您应该能看到类似以下的内容。

图 3:Visual 项目模板列表

只需单击“确定”,让 Visual Studio 生成构建 Wear 应用所需的文件。下图显示了具有默认示例代码的生成文件,供您开始构建 Wear 应用。

图 4:默认 Wear 应用代码

这很容易,对吧?以下是摘自官方文档的 Xamarin.Android 应用程序的结构:http://developer.xamarin.com/guides/android/getting_started/

文件夹          用途

参考文献 包含构建和运行应用程序所需的程序集。
Components Components 目录包含来自 Xamarin Components 的现成功能。
资产 包含应用程序运行所需的文件,包括字体、本地数据文件和文本文件。
属性 包含 AndroidManifest.xml 文件,该文件描述了我们 Xamarin.Android 应用程序的所有要求,包括名称、版本号和权限。
资源 包含应用程序资源,例如字符串、图像和布局。我们可以通过生成的 Resource 类在代码中访问这些资源。

运行应用程序

为了在没有真实设备的情况下运行应用程序,我们需要先设置一个模拟器。您可以按照以下几个步骤创建它。

转到“工具”>“Android”>“Android 模拟器管理器”,或只需单击工具栏上的 AVD 图标。见下图。

图 5:Android 内置模拟器

此时应会显示 Android 设备管理器窗口。在这里,我们可以编辑、启动、创建、删除或修复虚拟设备。现在单击“创建”按钮。将打开以下窗口,允许您选择要创建的设备。在这种情况下,我们只需要创建一个虚拟 Android Wear 设备来在模拟器中运行我们的应用程序。

图 6:AVD 对话框

一切设置完毕后,只需单击“确定”即可创建虚拟设备。您应该能在 AVD 管理器中看到您刚刚创建的设备,如下所示。

图 7:AVD 管理器

只需单击“启动”>“启动”即可在后台运行模拟器。请注意,加载模拟器可能需要一些时间。当模拟器加载并准备就绪后,您应该能在开始调试下拉菜单中看到您刚刚创建的虚拟设备的名称,如下所示。

图 8:新创建的虚拟设备

现在将您的应用程序设置为启动项目,然后按 F5 运行它。这是在模拟器中运行的 Wear 应用程序的示例输出。

图 9:输出

请记住,Visual Studio 中集成的默认模拟器速度较慢,仅适用于测试小型应用程序。在创建和测试应用程序的实际开发中,我强烈建议您使用 Xamarin Android Player 来模拟 Android 应用。

就是这样!如果您想参考更多 Wear 应用示例,只需访问此链接:Android Wear

在可穿戴设备和 Android 手持设备之间同步数据

让我们再进一步,创建一个可在 Wear 应用和手持设备之间通信的工作应用。此练习展示了如何在 Android 应用程序中同步数据。

创建 Android Wear 应用

要开始,让我们启动 Visual Studio 2013 并选择“文件”->“新建”->“项目...”。在“模板”下选择 C# > Android,然后选择 Wear App (Android) 项目。

将您的应用命名为您喜欢的任何名称,然后单击“确定”,让 Visual Studio 为您生成必要的文件。在此练习中,我将其命名为“WearDemo”。下图显示了具有默认示例代码的生成文件,可帮助您开始构建 Wear 应用。

图 10:Wear 应用项目

在开始修改默认代码之前,我想指出,可穿戴设备和手持设备之间有两种通信方式,分别是 DataApi 和 MessageApi。以下是每个 API 的简要说明。

DataApi 公开了一个 API,供组件读取或写入数据项和资源。DataItem 提供数据存储,可在手持设备和可穿戴设备之间自动同步。资源用于发送 BLOB 数据(例如图像)。您将资源附加到 DataItems,系统会自动为您处理传输。在此处阅读更多信息:此处

MessageApi 公开了一个 API,供组件向其他节点发送消息。消息通常应包含少量有效负载。您应该使用 DataApi 的资源来存储较大的数据。在此处阅读更多信息:此处

在此特定演示中,我将使用 DataApi 在设备之间发送/同步数据。由于 DataApi 是 Google Play 服务的一部分,因此我们需要做的第一件事是添加以下命名空间

using Android.Gms.Common.Apis;  
using Android.Gms.Wearable;

Android.Gms.Common.Apis 允许我们使用 GoogleApiClient,它是 Google Play 服务集成的入口点。 Android.Gms.Wearable 使我们能够使用 WearableClass。接下来是将我们的 MainActivity 类扩展为继承以下接口

  • IDataApiDataListener。
  • IGoogleApiClientConnectionCallbacks IGoogleApiClientOnConnectionFailedListener。

IDataApiDataListener 用于接收数据事件。 IGoogleApiClientConnectionCallbacks 提供在客户端连接或断开服务连接时调用的回调。 IGoogleApiClientOnConnectionFailedListener 提供客户端尝试连接服务失败的情况的回调。

总而言之,以下是向手持设备发送数据的示例代码

using System;  
using Android.Runtime;  
using Android.Widget;  
using Android.OS;  
using Android.Support.Wearable.Views;  
using Java.Interop;  
using Android.Gms.Common.Apis;  
using Android.Gms.Wearable;  
using System.Linq;  
  
namespace WearDemo  
{  
    [Activity(Label = "WearDemo", MainLauncher = true, Icon = "@drawable/icon")]  
    public class MainActivity : Activity,IDataApiDataListener, IGoogleApiClientConnectionCallbacks, IGoogleApiClientOnConnectionFailedListener  
    {  
  
        private IGoogleApiClient _client;  
        const string _syncPath = "/WearDemo/Data";  
        protected override void OnCreate(Bundle bundle) {  
            base.OnCreate(bundle);  
  
            _client = new GoogleApiClientBuilder(this, this, this)  
                             .AddApi(WearableClass.Api)  
                             .Build();  
  
            // Set our view from the "main" layout resource  
            SetContentView(Resource.Layout.Main);  
            var v = FindViewById<WatchViewStub>(Resource.Id.watch_view_stub);  
            v.LayoutInflated += delegate {  
  
                // Get our button from the layout resource,  
                // and attach an event to it  
                Button button = FindViewById<Button>(Resource.Id.myButton);  
  
                button.Click += delegate {  
                    SendData();  
                };  
            };  
        }  
  
        public void SendData() {  
            try {  
                var request = PutDataMapRequest.Create(_syncPath);  
                var map = request.DataMap;  
                map.PutString("Message", "Vinz says Hello from Wearable!");  
                map.PutLong("UpdatedAt", DateTime.UtcNow.Ticks);  
                WearableClass.DataApi.PutDataItem(_client, request.AsPutDataRequest());  
            }  
            finally {  
                _client.Disconnect();  
            }  
  
        }  
        protected override void OnStart() {  
            base.OnStart();  
            _client.Connect();  
        }  
        public void OnConnected(Bundle p0) {  
            WearableClass.DataApi.AddListener(_client, this);  
        }  
  
        public void OnConnectionSuspended(int reason) {  
            Android.Util.Log.Error("GMSonnection suspended " + reason);  
            WearableClass.DataApi.RemoveListener(_client, this);  
        }  
  
        public void OnConnectionFailed(Android.Gms.Common.ConnectionResult result) {  
            Android.Util.Log.Error("GMSonnection failed " + result.ErrorCode);  
        }  
  
        protected override void OnStop() {  
            base.OnStop();  
            _client.Disconnect();  
        }  
  
        public void OnDataChanged(DataEventBuffer dataEvents) {  
            var dataEvent = Enumerable.Range(0, dataEvents.Count)  
                                      .Select(i => dataEvents.Get(i).JavaCast<IDataEvent)  
                                      .FirstOrDefault(x => x.Type == DataEvent.TypeChanged && x.DataItem.Uri.Path.Equals(_syncPath));  
            if (dataEvent == null)  
                return;  
  
            //do stuffs here  
        }  
    }  
}  

好的,我将尝试解释代码中的内容。在 OnCreate 事件中,我们构建了一个包含 Wearable API 的 Google Play 服务客户端。然后,我们在按钮的单击处理程序中调用 SendData() 方法来发送数据。 SendData() 方法包含发送数据的实际逻辑。在那里,我们通过传递数据对象的路径“/WearDemo/Data”来创建一个 DataMapRequest。实际数据是包含 Message 和 UpdatedAt 值的 DataMap。接收方可以使用该路径来标识数据源,我将在本文后面讨论。

事件

  • OnStart 在活动开始时连接到数据层。
  • OnConnected  在数据层连接成功时触发。
  • OnStop  在活动停止时断开与数据层的连接。OnConnectionSuspended 和 OnConnectionFailed 是您处理所需连接回调的地方(例如,在此演示中,我们记录错误并分离服务)。
  • OnDataChanged  在数据更改时触发。

需要牢记的事项

  • 路径应始终以斜杠(/)开头。
  • 发送数据时时间戳是必需的,因为仅当数据真正更改时才会调用 OnDataChanged() 事件。添加时间戳到数据将确保该方法被调用。

在 AndroidManifest.xml 的 <application> 元素下添加以下 MetaData

<meta-data android:name="com.google.android.gms.version" 
           android:value="@integer/google_play_services_version" />  

创建主应用项目

为了测试数据的同步和发送,我们需要创建主 Android 应用来接收来自可穿戴设备的数据对象。主应用将安装在手持设备(例如手机或平板电脑)上。

现在右键单击解决方案项目并选择“添加”>“新建项目”。在“添加新项目”窗口中,选择“Visual C#”>“Android”>“Blank App (Android)”。您应该能看到如下内容

图 11:Android 主应用项目

为简单起见,我将项目命名为“MainAppDemo”。只需单击“确定”即可为您生成必要的文件。现在您的解决方案中应该有类似这样的内容。

图 12:解决方案资源管理器

在开始为主应用添加逻辑之前,我想强调以下几点。

您的 Wear 应用和主应用的名字空间应该相同。 在此示例中,Wear 应用使用“WearDemo”这个名字空间。因此,请务必将主应用的名字空间重命名为“WearDemo”以匹配。要更改默认名字空间,可以按照以下步骤操作。

  • 转到“项目”>“属性”>“默认名字空间”。
     
  • 要更改其余部分,可以使用 CTRL + H 并将默认名字空间替换为“WearDemo”。
     
  • 您还可以使用重构代码来更改名字空间。要执行此操作,只需右键单击名字空间并选择“重构”>“重命名”。

您的 Wear 应用和主应用包名也应该相同。 您可以通过右键单击项目并选择“属性”>“Android Manifest”来找到包名,如下面的图像所示

图 13:Android Manifest

确保两个包名都设置为“WearDemo.WearDemo”。请务必同时构建这两个项目,看看它们是否成功构建。完成这些操作后,让我们开始修改项目。首先,将“编译使用 Android 版本”的值更改为“API Level 21 (Xamarin.Android v5.0 Support)”。请参阅下图

图 14:应用设置

在“引用”下,检查您是否拥有 Xamarin.Android.Support.V4。如果您没有,只需右键单击“引用”并选择“管理 NuGet 程序包”。在“联机”>“Nuget.Org”中搜索“Xamarin.Android.Support.V4”。您应该能看到类似这样的内容

图 15:NuGet 程序包管理器

只需单击“安装”并等待完成。现在执行相同的过程,并安装“Xamarin.Android.Wear -Version 1.0.0”。

添加 WearableListenerService

扩展 WearableListenerService 可以让您监听数据层中的任何更新。系统会管理服务的生命周期,在需要发送数据项或消息时绑定服务,并在不需要工作时解除服务绑定。在此处阅读更多信息:此处

基于此声明,我们将使用 WearableListenerService 来监听数据层的更新并处理数据。因此,下一步是添加一个扩展 WearableListenerService 的类。为此,请右键单击项目根目录并选择“添加”>“类”,将其命名为“WearService”。以下是类的完整逻辑。

using System.Linq;  
using Android.App;  
using Android.Content;  
using Android.Runtime;  
using Android.Gms.Wearable;  
using Android.Gms.Common.Apis;  
using Android.Support.V4.Content;  
  
namespace WearDemo  
{  
    [Service]  
    [IntentFilter(new[] { "com.google.android.gms.wearable.BIND_LISTENER" })]  
    public class WearService : WearableListenerService  
    {  
        const string _syncPath = "/WearDemo/Data";  
        IGoogleApiClient _client;  
  
        public override void OnCreate() {  
            base.OnCreate();  
            _client = new GoogleApiClientBuilder(this.ApplicationContext)  
                    .AddApi(WearableClass.Api)  
                    .Build();  
  
            _client.Connect();  
  
            Android.Util.Log.Info("WearIntegrationreated");  
        }  
  
        public override void OnDataChanged(DataEventBuffer dataEvents) {  
            var dataEvent = Enumerable.Range(0, dataEvents.Count)  
                                      .Select(i => dataEvents.Get(i).JavaCast<IDataEvent)  
                                      .FirstOrDefault(x => x.Type == DataEvent.TypeChanged && x.DataItem.Uri.Path.Equals(_syncPath));  
            if (dataEvent == null)  
                return;  
  
            //get data from wearable  
            var dataMapItem = DataMapItem.FromDataItem(dataEvent.DataItem);  
            var map = dataMapItem.DataMap;  
            string message = dataMapItem.DataMap.GetString("Message");  
  
            Intent intent = new Intent();  
            intent.SetAction(Intent.ActionSend);  
            intent.PutExtra("WearMessage", message);  
            LocalBroadcastManager.GetInstance(this).SendBroadcast(intent);  
        }  
    }  
}  

上面的代码实现了 OnDataChanged 事件,该事件会过滤传入的数据事件,只保留“TypeChanged”类型的事件,然后检查数据对象路径是否为“/WearDemo/Data”,然后将数据本地广播出去。

主活动

以下是主活动类的代码块。

using Android.App;  
using Android.Content;  
using Android.Widget;  
using Android.OS;  
using Android.Support.V4.Content;  
  
namespace WearDemo  
{  
    [Activity(Label = "MainAppDemo", MainLauncher = true, Icon = "@drawable/icon")]  
    public class MainActivity : Activity  
    {  
        TextView _txtMsg;  
  
        protected override void OnCreate(Bundle bundle) {  
            base.OnCreate(bundle);  
  
            // Set our view from the "main" layout resource  
            SetContentView(Resource.Layout.Main);  
  
            // Get our TextBox from the layout resource,  
            _txtMsg = FindViewById<TextView>(Resource.Id.txtMessage);  
  
  
            IntentFilter filter = new IntentFilter(Intent.ActionSend);  
            MessageReciever receiver = new MessageReciever(this);  
            LocalBroadcastManager.GetInstance(this).RegisterReceiver(receiver, filter);  
        }  
  
        public void ProcessMessage(Intent intent) {  
            _txtMsg.Text = intent.GetStringExtra("WearMessage");  
        }  
  
        internal class MessageReciever : BroadcastReceiver  
        {  
            MainActivity _main;  
            public MessageReciever(MainActivity owner) { this._main = owner; }  
            public override void OnReceive(Context context, Intent intent) {  
                _main.ProcessMessage(intent);  
            }  
        }  
    }  
}  

在上面的代码中,我们在 OnCreate() 事件中注册以接收来自 ListenerService 的广播,然后定义一个扩展 BroadcastReceiver 的嵌套类,实现 OnReceive() 方法并提取数据。 Process() 方法负责将数据显示到 UI。

主布局

将您的 Main.xaml 修改为这样

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent">  
    <TextView  
        android:id="@+id/txtMessage"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:layout_marginTop="50dp"  
        android:gravity="center"  
        android:textColor="@android:color/white"  
        android:textSize="80sp" />  
</LinearLayout>  

上面的标记没什么特别之处。它只包含一个用于显示消息的 TextView。

添加 Google Play 服务元数据

最后,在 AndroidManifest.xml 的 <application> 元素下添加元数据

<meta-data android:name="com.google.android.gms.version" 
           android:value="@integer/google_play_services_version" />

接下来,我将展示如何在每个设备上部署每个应用程序并测试结果。

跨可穿戴设备和手持设备测试、调试和部署 Android 应用

在本节中,我们将研究如何在真实设备上部署和测试应用。首先,我使用 Nexus 9 和 LG G Watch 作为我的测试设备。

在开始之前,请确保您的计算机上已安装 Android 的 USB 驱动程序。您可以通过右键单击“计算机”>“管理”>“设备管理器”>“其他设备”来验证。如果驱动程序不在列表中,则必须在此处下载驱动程序:https://developer.android.com.cn/sdk/win-usb.html,并参考此链接获取安装指南:https://developer.android.com.cn/tools/extras/oem-usb.html#InstallingDriver

next important thing is to enable USB Debugging in your handheld device. You can enable it under SETTINGS > DEVELOPER OPTIONS > USB DEBUGGING. Once you have the required driver installed and you have enabled debugging for your device then just plug your handheld device into your PC or laptop. In Visual Studio you should be able to see the connected handheld device as shown in the figure below

图 16:项目

将主应用部署到手持设备

以下是部署应用的步骤

  • 右键单击主应用项目并选择“属性”>“Android 选项”。在“打包”选项卡下,取消选中“使用快速部署(仅限调试模式)”。
  • 在“打包”选项卡下,取消选中“使用快速部署(仅限调试模式)”。
  • 卸载项目。
  • 编辑 .CSPROJ 文件并添加此 PropertyGroup
<PropertyGroup>  
   <JavaMaximumHeapSize>1G</JavaMaximumHeapSize>  
</PropertyGroup>
  • 保存然后加载项目。
  • 右键单击主应用项目并将其设置为启动项目。
  • 构建应用。
  • 然后单击运行或播放按钮。这将打包并安装应用到设备。只需等待完成。

部署 Wear 应用

您可以按照与我们为主要应用所做的相同的步骤来部署 Wear 应用。如果您想通过蓝牙部署和调试您的应用,请按照以下附加步骤操作

  • 在您的手持设备上打开 Android Wear 配套应用。
  • 点击右上角的菜单,然后选择“设置”。
  • 启用“通过蓝牙调试”。您应该能看到如下状态:
Host: disconnected  
Target: connected  
  • 通过 USB 将手持设备连接到您的 PC 或笔记本电脑。
  • 在 Visual Studio 中,转到“工具”>“Android”>“Android ADB 命令提示符”并运行以下命令:    
adb forward tcp:4444 localabstract:/adb-hub  
adb connect localhost:4444 
  • 然后,您应该能在设备列表中看到 Wear 设备,如下面的图像所示:

图 17:连接的设备

  • 重复“将主应用部署到手持设备”中提到的相同步骤 1-5
  • 现在将您的 Wear 应用设置为启动项目,构建应用并运行。

安装后,您应该可以在 Visual Studio 中设置断点以进行调试并测试您的应用程序。这是示例应用程序的输出

图 18:最终输出

您可以从 Github 下载或获取演示项目供您参考。希望这篇文章能对某些人有所帮助。

摘要

在本文中,我们学到了以下内容

  • 可穿戴设备和 Android 的简要概述
  • 设置开发环境
  • 创建一个简单的 Android Wear 应用
  • 创建可在可穿戴设备和 Android 手持设备之间同步数据的应用
  • 跨可穿戴设备和手持设备测试、调试和部署 Android 应用

历史

© . All rights reserved.