Utilisation de DependencyService pour récupérer des informations du projet Android

Ajouté par Alexandre Journaux il y a environ 3 ans

Comme vous la savez surement, dans une solution développée en Xamarin, il y a au moins 2 projets : le projet principal et le projet de la plateforme (Android et/ou IOS et/ou UWP).
Le projet principal pilote tout l'affichage et le fonctionnel. C'est pour cela, que plus de 90% du code se fait dans ce projet. Par contre, en fonction du besoin, il est, parfois, nécessaire d'écrire du code dans le projet de la plateforme. Mais la question qui se pose alors : comment remonter les informations du projet de la plateforme dans le projet principal ? (pour, par exemple, l'afficher à l'écran).
Pour cela, nous allons utiliser la classe DependencyService.
Dans l'exemple ci-dessous, nous allons remonter les appareils détectés par le Bluetooth de l'appareil Android.
Note : Cela pourrait se faire directement dans le projet principal en utilisant aritchie. Mais ça n'illustrerait pas la problématique initial.

Tout d'abord, on va créer, dans le projet principal, une classe BleDevice qui contiendra les informations des appareils bluetooth :

public class BleDevice
{
    public String Address { get; set; }
    public String Name { get; set; }
}

Ensuite, toujours dans le projet principal, on va créer une interface IBluetoothService avec une méthode Scan() qui permettra de renvoyer une liste d'appareils détectés par Bluetooth :

public interface IBluetoothService
{
    List<BleDevice> Scan();
}

Maintenant, dans le projet Android, il faut donner au préalable les autorisations d'accès au bluetooth. Cela se fait dans la classe AssemblyInfo.cs

[assembly: UsesPermission(Android.Manifest.Permission.Bluetooth)]
[assembly: UsesPermission(Android.Manifest.Permission.BluetoothPrivileged)]
[assembly: UsesPermission(Android.Manifest.Permission.BluetoothAdmin)]

Ensuite, toujours dans le projet Android, on va créer une classe AndroidBluetoothService qui va implémenter IBluetoothService et donc la méthode Scan() :

public class AndroidBluetoothService : IBluetoothService
{
    public List<BleDevice> Scan()
    {
        List<BleDevice> bleDevices = new List<BleDevice>();

        BluetoothAdapter adapter = BluetoothAdapter.DefaultAdapter;
        adapter.Enable();
        if (adapter.IsDiscovering)
        {
            adapter.CancelDiscovery();
        }

        adapter.StartDiscovery();

        List<BluetoothDevice> devices = adapter.BondedDevices.ToList();

        foreach (BluetoothDevice device in devices)
        {
            BleDevice bleDevice = new BleDevice();
            bleDevice.Name = device.Name;
            bleDevice.Address = device.Address;
            bleDevices.Add(bleDevice);
        }            

        return bleDevices;
    }
}

Note : les classes BluetoothAdapter et BluetoothDevice viennent de Android.Bluetooth

Et enfin, pour le projet Android, on va dire au DependencyService qu'il faudra utiliser la classe AndroidBluetoothService comme implémentation de IBluetoothService.
Cela se fait dans le constructeur de MainActivity :

public MainActivity()
    {
        DependencyService.Register<IBluetoothService, AndroidBluetoothService>();
    }

Pour finir, il n'y a plus qu'à appeler la méthode Scan de l'interface dans le programme principal (par exemple, dans une commande) :

List<BleDevice> bleService = DependencyService.Get<IBluetoothService>().Scan();