Quite an old discussion and there seems to be several audio classes available already. However, I fought quite long with this one and found out you can play to different (volume) channels using Mediaplayer with the given reflector method, IF you load the file AFTER the reflector call.
In my Google Nexus I can play using SYSTEM/NOTIFICATION/DTMF/RING channels, anything EXCEPT for the ALARM and VOICE_CALL channels, for reason unknown. (Well, voice_call makes sense, sort of..)
As the method description says as follows:
public void setAudioStreamType (int streamtype)
Added in API level 1
Sets the audio stream type for this MediaPlayer. See AudioManager for a list of stream types. Must call this method before prepare() or prepareAsync() in order for the target stream type to become effective thereafter.
mp.Initialize2("MediaPlayer")
mp.looping=False
Dim rf As Reflector
rf.Target = mp
rf.Target = rf.GetField("mp")
rf.RunMethod2("setAudioStreamType", rf.GetStaticField("android.media.AudioManager","STREAM_RING"),"java.lang.int")
mp.Load(File.DirAssets, SoundStyle)
Seems to work just fine, as the Mediaplayer apparently does that "prepare()"-method when loading a new file, not in the initialize-stage.
I have no idea why the ALARM channel does not work when all the others do. Might be that my Nexus (google version) uses some other name for the alarm channel or just come 3rd party software I am using (a lot of them) is blocking the channel.