Frage

Beim Erstellen meiner Bluetooth-Anwendung benötige ich Zugriff auf einige Broadcast-Aktionen auf der Android-Seite meines Codes.

All dies wird in meinem Kern ausgeführt, also habe ich ein ViewModel, das über meine Schnittstelle aufgerufen wird

public interface IConnectionService
{
    //Properties
    string IntentName { get; }

    //Events
    event EventHandler<SearchConnectionItemEventArgs> SearchItemFoundEvent;

    //Methods
    void RunIntent();
    void SearchConnection();
    void Connect(string macAddress);
}

RunIntent fordert den Benutzer auf, Bluetooth einzuschalten (könnte eine andere Technologie sein), und ich möchte dann einen Ereignisauslöser haben, wenn der Bluetooth-Status geändert wird

Android.Bluetooth.BluetoothAdapter.ActionStateChanged

Und auch wenn ich nach neuen Geräten suche, die ich brauche

Android.Bluetooth.BluetoothDevice.ActionFound

Aber ich kann das [Android.Laufzeit.Register("ACTION_FOUND")] und [Android.Laufzeit.Register ("ACTION_STATE_CHANGED")] In meiner Klasse funktioniert dies nur, wenn ich versuche, es in meine Ansicht aufzunehmen, aber wenn ich das tue, brauche ich Logik in meiner Ansicht?

Ist es möglich, es irgendwie in den Kern zu stecken?

Meine Klasse implementiert meine Schnittstelle

using System;
using Android.Bluetooth;
using Android.Content;
using Cirrious.MvvmCross.Android.Platform.Tasks;
using Test.Core.Interfaces;
using Test.Core.Models;

namespace Test.Core.Android
{
    public class AndroidBluetooth : MvxAndroidTask, IConnectionService
    {
    #region Private Fields

    private readonly BluetoothAdapter _bluetoothAdapter;

    #endregion
    #region Public Fields

    #endregion
    #region Properties

    public string IntentName { get { return "Turn on Bluetooth"; }}

    #endregion
    #region Constructor

    public AndroidBluetooth()
    {
        _bluetoothAdapter = BluetoothAdapter.DefaultAdapter;
    }

    #endregion
    #region Events

    public event EventHandler<SearchConnectionItemEventArgs> SearchItemFoundEvent;
    private void ItemFound(SearchConnectionItemEventArgs e)
    {
        if(SearchItemFoundEvent != null)
        {
            SearchItemFoundEvent(this, e);
        }
    }

    #endregion

    #region Methods
    public void RunIntent()
    {
        if (_bluetoothAdapter == null)
        {
            //No bluetooth support on phone
        }
        else if(!_bluetoothAdapter.IsEnabled)
        {
            var intent = new Intent(BluetoothAdapter.ActionRequestEnable);
            StartActivity(intent);
        }
    }

    public void SearchConnection()
    {

        if (_bluetoothAdapter == null)
        {
            //No bluetooth support on phone
        }
        else if (!_bluetoothAdapter.IsEnabled)
        {
            //Bluetooth not turned on
            RunIntent();
        }
        else
        {
            FindBondedDevices();
        }
    }

    private void FindBondedDevices()
    {
        var pairedDevices = _bluetoothAdapter.BondedDevices;

        if (pairedDevices.Count <= 0) return;

        foreach (var item in pairedDevices)
        {
            ItemFound(new SearchConnectionItemEventArgs {Name = item.Name, MacAddress = item.Address});
        }
    }

    private void FindNewDevices()
    {
        if (_bluetoothAdapter == null)
        {

        }
        else if (!_bluetoothAdapter.IsEnabled)
        {

        }
        else
        {
            _bluetoothAdapter.StartDiscovery();
            //Bind event for new devices
        }
    }

    public void Connect(string macAddress)
    {

    }
    #endregion
}
}
War es hilfreich?

Lösung

Haftungsausschluss:Ich bin mit diesem Teil von Android nicht vertraut - ich habe den Bluetooth-Stack noch nie verwendet.

Aus Ihrer Beschreibung geht hervor, dass Sie die Antwort bereits kennen - diese Attribute müssen auf Methoden innerhalb der Aktivität / Ansicht angewendet werden.

Sobald sie der Aktivität / Ansicht hinzugefügt wurden, ist es natürlich einfach, diese Methodenaufrufe an das ViewModel weiterzuleiten - verwenden Sie einfach das ViewModel eigentum innerhalb der Ansicht.


Es ist wahrscheinlich einfacher, zuerst zu versuchen, diesen Teil Ihrer Arbeit als eigenständiges Beispiel zu erhalten - und dann herauszufinden, wie Sie es plattformübergreifend und / oder mvvm machen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top