using System.Runtime.InteropServices; using UnityEngine; namespace Unity.Services.Analytics.Platform { static class DeviceVolumeProvider { internal static bool VolumeAvailable { get { #if (UNITY_IOS || UNITY_ANDROID) && !UNITY_EDITOR return true; #else return false; #endif } } #if UNITY_IOS && !UNITY_EDITOR [DllImport("__Internal")] static extern float unity_services_analytics_get_device_volume(); #endif internal static float GetDeviceVolume() { #if UNITY_IOS && !UNITY_EDITOR // Provided by the plugin in Runtime/Plugins/iOS/VolumeIOSPlugin.mm return unity_services_analytics_get_device_volume(); #elif UNITY_ANDROID && !UNITY_EDITOR // The below code should be equivalent to the following Android code. Note that constants have been converted to their raw values, // as documented in the android docs. // --- // Activity activity = UnityPlayer.currentActivity; // Get the current activity as provided by Unity // AudioManager audioManager = (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE); // Get the system audio service from the activity // double volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); // Get the music/media audio stream volume AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject activity = jc.GetStatic("currentActivity"); AndroidJavaObject audioManager = activity.Call("getSystemService", "audio"); int STREAM_MUSIC_rawValue = 3; // See android docs for STREAM_MUSIC constant on AudioManager int volume = audioManager.Call("getStreamVolume", STREAM_MUSIC_rawValue); int maxVolume = audioManager.Call("getStreamMaxVolume", STREAM_MUSIC_rawValue); return (float)volume / (float)maxVolume; #else // Other platforms don't support device volume at this time. return 0.0f; #endif } } }