В решении Xamarin.Forms стоит следующая задача: необходимо реализовать систему, которая будет следить за подключением/отключением USB-устройств. Эта задача была мною решена с помощью BroadcastReceiver. Но во время реализации возник вопрос о том, каким же образом общий проект (Не Android) будет узнавать о том, что было подключено или отключено устройство. Проблема была решена с помощью DependencyService следующим образом: в общем проекте я создал следующий класс:
public interface IUsbReceiver
{
event EventHandler UsbDeviceAttached;
event EventHandler UsbDeviceDetached;
void RegisterAttachReceiver();
void RegisterDetachReceiver();
}
В последствии который наследовал и реализовал в Android-проекте:
[assembly: Dependency(typeof(MobileApp.Droid.Utils.UsbBroadcastReceiver))]
namespace MobileApp.Droid.Utils
{
public class UsbBroadcastReceiver : IUsbReceiver
{
public event EventHandler UsbDeviceAttached;
public event EventHandler UsbDeviceDetached;
public UsbBroadcastReceiver() { }
public void RegisterAttachReceiver()
{
UsbAttachBroadcastReceiver usbAttach = new UsbAttachBroadcastReceiver();
IntentFilter intentAttached = new IntentFilter(UsbManager.ActionUsbDeviceAttached);
MainActivity.CurrentActivity.RegisterReceiver(usbAttach, intentAttached);
usbAttach.UsbDeviceAttached += UsbAttach_UsbDeviceAttached;
}
public void RegisterDetachReceiver()
{
UsbDetachBroadcastReceiver usbDetach = new UsbDetachBroadcastReceiver();
IntentFilter intentDetached = new IntentFilter(UsbManager.ActionUsbDeviceDetached);
MainActivity.CurrentActivity.RegisterReceiver(usbDetach, intentDetached);
usbDetach.UsbDeviceDetached += UsbDetach_UsbDeviceDetached;
}
private void UsbDetach_UsbDeviceDetached(object sender, EventArgs e)
{
UsbDeviceDetached?.Invoke(this, e);
}
private void UsbAttach_UsbDeviceAttached(object sender, EventArgs e)
{
UsbDeviceAttached?.Invoke(this, e);
}
}
public class UsbDetachBroadcastReceiver : BroadcastReceiver
{
public event EventHandler UsbDeviceDetached;
public UsbDetachBroadcastReceiver() { }
public override void OnReceive(Context context, Intent intent)
{
UsbDeviceDetached?.Invoke(this, new EventArgs());
}
}
public class UsbAttachBroadcastReceiver : BroadcastReceiver
{
public event EventHandler UsbDeviceAttached;
public UsbAttachBroadcastReceiver() { }
public override void OnReceive(Context context, Intent intent)
{
UsbDeviceAttached?.Invoke(this, new EventArgs());
}
}
}
MainActivity.CurrentActivity - это просто статическое свойство в MainActivity.cs Droid-проекта:
public static Activity CurrentActivity { get; private set; }
Которому я в OnCreate() присваиваю текущий экземпляр:
CurrentActivity = this;
После реализации класса выше, в общем проекте, в App.xaml.cs, создал статическое свойство:
public static IUsbReceiver UsbReceiver { get; set; }
И в MainPage.xaml (страница содержимого в общем проекте) делаю следующее:
protected override void OnAppearing()
{
base.OnAppearing();
App.UsbReceiver = DependencyService.Get<IUsbReceiver>();
App.UsbReceiver.RegisterAttachReceiver();
App.UsbReceiver.RegisterDetachReceiver();
App.UsbReceiver.UsbDeviceAttached += UsbReceiver_UsbDeviceAttached;
App.UsbReceiver.UsbDeviceDetached += UsbReceiver_UsbDeviceDetached;
}
И в методах UsbReceiver_UsbDeviceAttached и UsbReceiver_UsbDeviceDetached делаю свои необходимые действия. Всё работает. Но я уверен, что подобная реализация неправильная и нарушает правила. Кто-то может что-то посоветовать как можно поступить лучше? Здоровая критика очень приветствуется.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Я экспортировал все внутриновсти спомощью dotPeek, получил папки и файлыМне нужно было немного подкоректировать код(добавить пару ссылок), я сделал...
Бьюсь весь день, не могу понять, как работает передаваемый параметр index в Points, а также, что выполняет данная строчка:
В XamarinForms при подключении USB-устройства у пользователя запрашивается разрешение на использование устройства
Есть ли в питоне что-то похожее на PictureBox из c#?