Introduction to Advanced Device Features

.NET MAUI provides robust APIs to leverage native device features, enabling you to build richer, more interactive, and platform-specific experiences. This tutorial explores how to integrate common device capabilities like the camera, sensors, location services, and haptic feedback into your MAUI applications.

By utilizing these advanced features, you can create applications that are more engaging and performant, taking full advantage of the hardware available on each target platform.

Camera Integration

Accessing the device's camera is crucial for many applications, from photo editing to augmented reality. .NET MAUI simplifies this process.

Accessing the Camera

You can use the Microsoft.Maui.Media.IMediaPicker interface to interact with the camera and photo library.


using Microsoft.Maui.Media;

async Task TakePhotoAsync()
{
    try
    {
        var photo = await MediaPicker.CapturePhotoAsync();
        if (photo != null)
        {
            var stream = await photo.OpenReadAsync();
            // Use the stream to display the image or save it
            var imageSource = ImageSource.FromStream(() => stream);
            // Assign imageSource to an Image control's Source property
        }
    }
    catch (FeatureNotSupportedException fnsEx)
    {
        // Feature is not supported on the device
        Console.WriteLine($"Feature not supported: {fnsEx.Message}");
    }
    catch (PermissionException pEx)
    {
        // Handle permission denial
        Console.WriteLine($"Permissions denied: {pEx.Message}");
    }
    catch (Exception ex)
    {
        // Other exceptions
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}
                    

Capturing Photos & Videos

The IMediaPicker also allows capturing videos. Remember to handle platform-specific permissions for camera and storage access.


async Task RecordVideoAsync()
{
    try
    {
        var video = await MediaPicker.CaptureVideoAsync();
        if (video != null)
        {
            var stream = await video.OpenReadAsync();
            // Use the stream to play or save the video
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}
                    

Device Sensors

.NET MAUI exposes various device sensors through the Microsoft.Maui.Sensors namespace.

Accelerometer

The accelerometer measures the acceleration of the device, including the force of gravity. It's useful for detecting device orientation changes and motion.


using Microsoft.Maui.Sensors;

void ToggleAccelerometer()
{
    if (Accelerometer.Default.IsMonitoring)
        Accelerometer.Default.Stop();
    else
    {
        Accelerometer.Default.ReadingChanged += Accelerometer_ReadingChanged;
        Accelerometer.Default.Start();
    }
}

void Accelerometer_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
    var data = e.Reading;
    Console.WriteLine($"Accleration: X={data.Acceleration.X}, Y={data.Acceleration.Y}, Z={data.Acceleration.Z}");
}
                    

Gyroscope

The gyroscope measures the rate of rotation of the device around its axes. It's often used in gaming and virtual reality applications.


using Microsoft.Maui.Sensors;

void ToggleGyroscope()
{
    if (Gyroscope.Default.IsMonitoring)
        Gyroscope.Default.Stop();
    else
    {
        Gyroscope.Default.ReadingChanged += Gyroscope_ReadingChanged;
        Gyroscope.Default.Start();
    }
}

void Gyroscope_ReadingChanged(object sender, GyroscopeChangedEventArgs e)
{
    var data = e.Reading;
    Console.WriteLine($"Rotation Rate: X={data.AngularVelocity.X}, Y={data.AngularVelocity.Y}, Z={data.AngularVelocity.Z}");
}
                    

Compass

The compass provides the device's magnetic heading relative to true north.


using Microsoft.Maui.Sensors;

void ToggleCompass()
{
    if (Compass.Default.IsMonitoring)
        Compass.Default.Stop();
    else
    {
        Compass.Default.ReadingChanged += Compass_ReadingChanged;
        Compass.Default.Start();
    }
}

void Compass_ReadingChanged(object sender, CompassChangedEventArgs e)
{
    var data = e.Reading;
    Console.WriteLine($"Compass: Heading={data.HeadingMagneticNorth}");
}
                    

Location Services

Accessing the device's location is fundamental for mapping, navigation, and location-aware features.

Geolocation

The IGeolocation interface allows you to retrieve the device's current location.


using Microsoft.Maui.Devices.Sensors;

async Task GetLocationAsync()
{
    try
    {
        var location = await Geolocation.Default.GetLocationAsync(new GeolocationRequest(GeolocationAccuracy.High, TimeSpan.FromSeconds(10)));

        if (location != null)
        {
            Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");
        }
    }
    catch (FeatureNotEnabledException fneeEx)
    {
        // Location is not enabled on the device
        Console.WriteLine($"Location disabled: {fneeEx.Message}");
    }
    catch (PermissionException pEx)
    {
        // Handle permission denial
        Console.WriteLine($"Permissions denied: {pEx.Message}");
    }
    catch (Exception ex)
    {
        // Other exceptions
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}
                    

Displaying Maps

While .NET MAUI doesn't have a built-in map control, you can use platform-specific map controls or navigate to external map applications.

To embed maps, consider using community-driven libraries like Mapsui or platform-specific controls within your MAUI project.

Alternatively, you can launch the device's default map application:


using Microsoft.Maui.Essentials; // For older versions, check MAUI equivalent

async Task OpenLocationInMapAsync(double latitude, double longitude)
{
    try
    {
        var location = new Location(latitude, longitude);
        var options = new MapLaunchOptions { Name = "My Location" };

        await Map.Default.OpenAsync(location, options);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}
                    

Haptic Feedback

Haptic feedback, or vibration, can enhance user interaction by providing physical cues.


using Microsoft.Maui.Devices; // For older versions, check MAUI equivalent

void TriggerHapticFeedback()
{
    // Check if haptics are supported and enabled
    if (HapticFeedback.Default.IsSupported)
    {
        HapticFeedback.Default.Perform(HapticFeedbackType.Click); // Or HapticFeedbackType.LongPress, HapticFeedbackType.Ripple, HapticFeedbackType.SystemDefault
    }
    else
    {
        Console.WriteLine("Haptic feedback not supported on this device.");
    }
}
                    
Try tapping a button that calls TriggerHapticFeedback() to feel a subtle click.

Conclusion

By mastering these advanced device features, you can elevate your .NET MAUI applications from simple UIs to sophisticated, feature-rich experiences that truly leverage the power of the devices your users interact with daily. Remember to always handle permissions gracefully and provide a fallback for unsupported features.

Continue exploring the .NET MAUI documentation for more insights into platform-specific APIs and best practices.