将背景音乐音量从活动更改为服务

Posted

技术标签:

【中文标题】将背景音乐音量从活动更改为服务【英文标题】:Change background music volume from activity to service 【发布时间】:2020-11-27 15:43:18 【问题描述】:

我是 android 新手,正在做一个项目,我必须在我们的应用程序中实现背景音乐。我已经使用服务实现了背景音乐,问题是:我不知道如何使用活动中的搜索栏动态更改音乐的音量。

我的服务如下所示:

package hu.szoftverprojekt.holdemfree.controller;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

import androidx.annotation.Nullable;

import hu.szoftverprojekt.holdemfree.R;

public class PlaySound extends Service 

    MediaPlayer player;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) 
        return null;
    

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
        player=MediaPlayer.create(this, R.raw.ss);
        player.setLooping(true);
        player.start();
        player.setVolume(SettingsScreen.volume, SettingsScreen.volume);
        return START_STICKY;
    

    @Override
    public void onDestroy() 
        super.onDestroy();
        player.stop();
    

【问题讨论】:

【参考方案1】:

好吧,一旦您在更改 SeekBar 时调用了 SeekBarOnSeekBarChangeListener,接下来的主要事情就是将此更改从您的活动传达给您的服务。

查看 android 文档 Creating a bound service,了解在 ActivityService 之间进行通信的官方方式,不使用第三方库。

但是

您还可以使用像 EventBus 这样的第 3 方库(我建议这样做,因为在我看来它更容易使用和实施)。

这里是一个使用EventBus的例子:

build.gradle:

dependencies 
    implementation 'org.greenrobot:eventbus:3.2.0'

MediaVolumeEvent.java:

public class MediaVolumeEvent 
    private int volume;

    public MediaVolumeEvent(int volume) 
        this.volume = volume;
    

    public int getVolume() 
        return volume;
    

PlaySound.java:

public class PlaySound extends Service 
  @Override
  public void onCreate() 
    super.onCreate();
    EventBus.getDefault().register(this);
  

  @Override
  public void onDestroy() 
    EventBus.getDefault().unregister(this);
    player.stop();
    super.onDestroy();
  

  @Subscribe(threadMode = ThreadMode.MAIN) 
  public void onEvent(MediaVolumeEvent event)
    player.setVolume(event.getVolume(), event.getVolume());
  

在你的activity里面OnSeekBarChangeListener

SeekBar seekBar= (SeekBar) findViewById(R.id.seekBar);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()        

    @Override       
    public void onStopTrackingTouch(SeekBar seekBar)       
        // TODO Auto-generated method stub      
           

    @Override       
    public void onStartTrackingTouch(SeekBar seekBar)      
        // TODO Auto-generated method stub      
           

    @Override       
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) 
        EventBus.getDefault().post(new MediaVolumeEvent(progress));
           
);

【讨论】:

请看我的更新,我忘了在服务类中的onEvent 方法上添加@Subscribe(threadMode = ThreadMode.MAIN) ,这是服务实际获取活动发送的消息所必需的 非常感谢! :) 你帮了我很多! 当然可以。如果是,请将此问题标记为已解决。谢谢

以上是关于将背景音乐音量从活动更改为服务的主要内容,如果未能解决你的问题,请参考以下文章

将 android EditText 样式从矩形边框更改为下划线

如何以编程方式将背景颜色从 android.support.design 更改为 MaterialButton

Mogrify / ImageMagick 将 jpeg 背景从灰色更改为白色

将android EditText样式从矩形边框更改为下划线

当用户在表格视图中向下滚动时,如何将 UINavigationBar 背景颜色从透明更改为红色

如何将 PNG 图像的背景和前景色更改为从颜色托盘中选择?