Xamarin.Android でシステムボリュームが変更されたことを検知する

teratail に投稿された質問への回答ですが、こちらにも貼っときます。

Stackoverflow の回答にある Java-Android のコードを、 Xamarin.Android 用に少し「書き換え」ただけです。

// MainActivity.cs
using Android.App;
using Android.Widget;
using Android.OS;
using Android.Content;

namespace VolumeSample
{
    [Activity(Label = "VolumeSample", MainLauncher = true, Icon = "@mipmap/icon")]
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            this.ApplicationContext.ContentResolver.RegisterContentObserver(
                Android.Provider.Settings.System.ContentUri, true, 
                new VolumeObserver(this, new Handler()));
        }
    }

    internal class VolumeObserver : Android.Database.ContentObserver
    {
        private readonly Context context;

        public VolumeObserver(Context context, Handler handler) : base(handler)
        {
            this.context = context;
        }

        public override void OnChange(bool selfChange)
        {
            base.OnChange(selfChange);

            var audioManager = (Android.Media.AudioManager)context.GetSystemService(Context.AudioService);
            var volume = audioManager.GetStreamVolume(Android.Media.Stream.System);
            Toast.MakeText(context, 
                           $"Current System Vol: {volume}", 
                           ToastLength.Short).Show();
        }
    }
}

BroadcastReceiver を使うことでも実現できるようですね。