C# 如何通过主活动更改媒体播放器的音量
我使用c#xamarin,我遇到了一个问题,我使用背景音乐,我想用搜索栏控制音量,但我有几个问题,音乐是一种意图。 我在背景音乐课上写了一个设置音量的方法,但是我无法访问它,因为音乐是一种意图。 这是背景音乐课:C# 如何通过主活动更改媒体播放器的音量,c#,android,xamarin,service,android-mediaplayer,C#,Android,Xamarin,Service,Android Mediaplayer,我使用c#xamarin,我遇到了一个问题,我使用背景音乐,我想用搜索栏控制音量,但我有几个问题,音乐是一种意图。 我在背景音乐课上写了一个设置音量的方法,但是我无法访问它,因为音乐是一种意图。 这是背景音乐课: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.Media;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace Arkanoid
{
[Service]
class backgroundMusic : Service
{
public ISharedPreferences sp;
private MediaPlayer mp;
public override IBinder OnBind(Intent intent)
{
return null;
}
public void SetVolume(int vol)
{
mp.SetVolume(vol, vol);
}
public override void OnCreate()
{
sp = this.GetSharedPreferences("details", FileCreationMode.Private);
int volume = sp.GetInt("backgroundMusic", 50);
base.OnCreate();
mp = MediaPlayer.Create(this, Resource.Raw.backgroundMusic);
mp.Looping = true;
mp.SetVolume(volume, volume);
}
[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
int volume = sp.GetInt("backgroundMusic", 50);
mp.SetVolume(((float)volume)/100, ((float)volume)/100);
int position = sp.GetInt("position", 0);
mp.SeekTo(position);
mp.Start();
return base.OnStartCommand(intent, flags, startId);
}
public override void OnDestroy()
{
ISharedPreferencesEditor editor = sp.Edit();
editor.PutInt("position", mp.CurrentPosition);
editor.Commit();
mp.Stop();
mp.Release();
base.OnDestroy();
}
}
}
以下是我开始音乐的方式,在主要活动中,在OnCreate中
bMusic = new Intent(this, typeof(backgroundMusic));
StartService(bMusic);
问题是:
private void Music_ProgressChanged(object sender, SeekBar.ProgressChangedEventArgs e)
{
vMusic = e.Progress;
//missing code here
}
我写“这里缺少代码”的地方就是我需要改变音乐音量的地方。
另外,因为我在OnCreate中编写了StartService(bMusic),所以每次我在创建时它都会重新启动歌曲,我不希望这样,我希望它在应用程序运行时一直运行,只有我通过搜索栏更改音量
提前感谢。您可以使用音频管理器来控制音乐音量
private AudioManager audioManager;
private int maxVolume, currentVolume;
Intent bMusic;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
...
bMusic = new Intent(this, typeof(backgroundMusic));
StartService(bMusic);
audioManager = (AudioManager)GetSystemService(AudioService);
maxVolume = audioManager.GetStreamMaxVolume(Stream.Music);
SeekBar seekBar = FindViewById<SeekBar>(Resource.Id.seek);
currentVolume = audioManager.GetStreamVolume(Stream.Music);
seekBar.Max = maxVolume;
seekBar.Progress = currentVolume;
seekBar.ProgressChanged += SeekBar_ProgressChanged;
}
private void SeekBar_ProgressChanged(object sender, SeekBar.ProgressChangedEventArgs e)
{
audioManager.SetStreamVolume(Stream.Music, e.Progress, 0);
}
protected override void OnDestroy()
{
base.OnDestroy();
StopService(bMusic); // you need call stopService then it will call the OnDestroy method of your service,then it will save the currentposition,and next time it will continue the music.
}
私人AudioManager AudioManager;
private int maxVolume,currentVolume;
意图音乐;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
...
b音乐=新的意图(这是背景音乐的类型);
StartService(bMusic);
audioManager=(audioManager)GetSystemService(AudioService);
maxVolume=audioManager.GetStreamMaxVolume(Stream.Music);
SeekBar SeekBar=findviewbyd(Resource.Id.seek);
currentVolume=audioManager.GetStreamVolume(Stream.Music);
seekBar.Max=maxVolume;
seekBar.Progress=currentVolume;
seekBar.ProgressChanged+=seekBar\u ProgressChanged;
}
私有void SeekBar_ProgressChanged(对象发送方,SeekBar.ProgressChangedEventArgs e)
{
audioManager.SetStreamVolume(Stream.Music,e.Progress,0);
}
受保护的覆盖无效OnDestroy()
{
base.ondestory();
StopService(bMusic);//您需要调用StopService,然后它将调用服务的OnDestroy方法,然后它将保存当前位置,下次它将继续播放音乐。
}
让我添加一些内容,以便您能更了解我。我希望在应用程序运行时始终播放音乐,在主活动中我打开一个自定义对话框,其中有搜索栏来控制音量,我希望在更改搜索栏的进度时更改音量,而不是更改手机的声音,因此我们需要做的是在应用程序第一次运行时启动音乐,然后,我们需要通过搜索栏控制其音量,但永远不要停止音乐,即使主活动被破坏,并且当我在不同活动中时音乐应该打开。您可以尝试定义一个接口,然后在您的服务中实现它。