Xamarin.Forms Bluetooth-интерфейс выбора - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь написать методы внедрения зависимостей с интерфейсом, чтобы у меня был действительно единый пользовательский интерфейс для Android и UWP.

Обработка и тестирование по одной функции за раз. Схема работает, но моя проблема в том, что на стороне UWP большинство функций асинхронно, а на Android нет.

Так что мой вопрос, должен ли я "подделывать" асинхронные функции на стороне Android, и если да, то как?

Вот мой пример:

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. Итак, как мне изменить это, чтобы «подделать» асинхронный метод, предполагая, что это будет лучшим выбором? Или есть другой способ, о котором я не думаю?

[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 Ответ

0 голосов
/ 28 апреля 2018

Я нашел лучший путь:

-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

Теперь все работает отлично, я получаю список устройств USB / Serial как с Android, так и с Windows UWP. Конечно, потребуется время, чтобы создать весь процесс для обеих платформ, но, по крайней мере, похоже, что я нахожусь на хорошем старте.

Не стесняйтесь, если у вас есть какие-либо комментарии, рекомендации, возможно, лучший способ .....

...