Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过主活动更改媒体播放器的音量_C#_Android_Xamarin_Service_Android Mediaplayer - Fatal编程技术网

C# 如何通过主活动更改媒体播放器的音量

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.

我使用c#xamarin,我遇到了一个问题,我使用背景音乐,我想用搜索栏控制音量,但我有几个问题,音乐是一种意图。 我在背景音乐课上写了一个设置音量的方法,但是我无法访问它,因为音乐是一种意图。 这是背景音乐课:

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方法,然后它将保存当前位置,下次它将继续播放音乐。
}

让我添加一些内容,以便您能更了解我。我希望在应用程序运行时始终播放音乐,在主活动中我打开一个自定义对话框,其中有搜索栏来控制音量,我希望在更改搜索栏的进度时更改音量,而不是更改手机的声音,因此我们需要做的是在应用程序第一次运行时启动音乐,然后,我们需要通过搜索栏控制其音量,但永远不要停止音乐,即使主活动被破坏,并且当我在不同活动中时音乐应该打开。您可以尝试定义一个接口,然后在您的服务中实现它。