Xamarin.Forms 蓝牙接口选择

Xamarin.Forms Bluetooth Interface choices

我正在尝试编写带有接口的依赖项注入方法,以便我能够真正为 Android 和 UWP 提供一个用户界面。

一次处理和测试一项功能。该模式正在运行,但我的问题是在 UWP 端,大多数函数都是异步的,而它们不在 Android 上。

所以我的问题是,我是否应该在 android 端 "fake" 异步函数,如果是,怎么办?

这是我的例子:

using System.Collections.Generic;
using System.Threading.Tasks;

namespace XamarinBTArduinoLed
{
    public interface IBlueTooth
    {
        // as a first test, I will try to get a list of paired devices in both Android and UWP
        List<string> PairedDevices();
    }
}

这适用于 Android,但对于 UWP,它需要

public interface IBlueTooth
    {
        // as a first test, I will try to get a list of paired devices in both Android and UWP
        Task<List<string>> PairedDevices();
    }

这不适用于我当前的 Android 实施。那么,假设它是最佳选择,我应该如何将其修改为 "fake" 异步方法?或者有没有其他我没有考虑的方法?

[assembly: Xamarin.Forms.Dependency(typeof(XamarinBTArduinoLed.Droid.BlueToothInterface))]
    namespace XamarinBTArduinoLed.Droid
    {

        public class BlueToothInterface : IBlueTooth
        {       
            public List<string> PairedDevices()
            {
                List<string> BTItems = new List<string>();

                BluetoothAdapter adapter = BluetoothAdapter.DefaultAdapter;
                if (adapter == null) throw new Exception("No BlueTooth Adapter Found.");
                if (!adapter.IsEnabled)
                {
                    adapter.Enable();
                }
                //if (!adapter.IsEnabled)
                //{
                //    throw new Exception("BlueTooth adapter is NOT enabled.");
                //}
                foreach (var item in adapter.BondedDevices)
                {     

                    BTItems.Add(item.Name + " - " + item.Type.ToString());
                }
                return BTItems;
            }
        }
    }

我发现似乎是最好的方法:

-1- 我更改了接口以获取返回的任务:

public interface IBlueTooth
    {
        // as a first test, I will try to get a list of paired devices in both Android and UWP
        Task<List<string>> PairedDevices();
    }

-2- 我相应地修改了 Android 实现:

public Task<List<string>> PairedDevices()
        {
            List<string> BTItems = new List<string>();

            BluetoothAdapter adapter = BluetoothAdapter.DefaultAdapter;
            if (adapter == null) throw new Exception("No BlueTooth Adapter Found.");
            if (!adapter.IsEnabled)
            {
                adapter.Enable();
            }
            var t = Task.Factory.StartNew(() =>
                {
                    foreach (var item in adapter.BondedDevices)
                    {

                        BTItems.Add(item.Name);
                    }
                    return BTItems;
                });
            return t;
        }

-3- 我实施了 INotifyPropertyChanged 以在 XAML

中显示

这现在运行良好,我从 Android 和 Windows UWP 获得了我的 USB/Serial 设备列表。为两个平台创建整个过程肯定需要一段时间,但至少看起来我有了一个良好的开端。

如果您有任何意见、建议,请不要犹豫,也许有更好的方法.....