Experiments Never Fail

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 を使うことでも実現できるようですね。

published at tags: Android C# Xamarin