简体   繁体   English

如何使用多个 SeekBars (Android) 一次控制多个声音的音量?

[英]How to control the volume of multiple sounds at once using multiple SeekBars (Android)?

How can I control the volume of multiple sounds playing at the same time using multiple SeekBars?如何使用多个 SeekBars 控制同时播放的多个声音的音量? There are three mp3 files are played at the same time.同时播放三个mp3文件。 There are three SeekBars, each Seekbar progress should relate to the volume of it's relative sound file.共有三个 SeekBar,每个 Seekbar 的进度都应该与它的相关声音文件的音量有关。 The issue I'm having is that when I move one SeekBar, that controls the volume of all three sounds.我遇到的问题是,当我移动一个 SeekBar 时,它控制所有三种声音的音量。

Here's the Android code followed by the XML:这是 Android 代码,后跟 XML:

/*
Created by: Justin Clark
Company: VaughnX
Date: June 15 2017
Purpose: To block out external sound using white, brown, and pink noise.
To do:  -Increase duration of brown and pink noise files.
        -use seek slider as an in-app volume controller
 */

package com.vaughnx.vaugi.soundwall;

import android.app.Activity;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.ToggleButton;
import android.media.MediaPlayer;
import android.media.AudioManager;

public class MainActivity extends Activity {

    private SeekBar whiteVolumeSeekBar;
    private SeekBar pinkVolumeSeekBar;
    private SeekBar brownVolumeSeekBar;
    private AudioManager whiteAudioManager;
    private AudioManager pinkAudioManager;
    private AudioManager brownAudioManager;
    private int maxVolume;
    private int curVOlume;
    final MediaPlayer whiteNoiseMP = MediaPlayer.create(this, R.raw.whitenoise);
    final MediaPlayer brownNoiseMP = MediaPlayer.create(this, R.raw.brownnoise);
    final MediaPlayer pinkNoiseMP = MediaPlayer.create(this, R.raw.pinknoise);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
        initializeSoundController();
        initializeVolumeController();
    }
    //Sets up white, brown, and pink noise players. Uses toggle buttons to turn sound on
    //and off.
    public void initializeSoundController() {


        ToggleButton whiteNoiseToggle = (ToggleButton) findViewById(R.id.whitenoisebutton);
        whiteNoiseToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    // The toggle is enabled
                    whiteNoiseMP.start();
                } else {
                    // The toggle is disabled
                    whiteNoiseMP.pause();
                }
            }
        });
        ToggleButton brownNoiseToggle = (ToggleButton) findViewById(R.id.brownnoisebutton);
        brownNoiseToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    // The toggle is enabled
                    brownNoiseMP.start();
                } else {
                    // The toggle is disabled
                    brownNoiseMP.pause();
                }
            }
        });
        ToggleButton pinkNoiseToggle = (ToggleButton) findViewById(R.id.pinknoisebutton);
        pinkNoiseToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    // The toggle is enabled
                    pinkNoiseMP.start();
                } else {
                    // The toggle is disabled
                    pinkNoiseMP.pause();
                }
            }
        });

    }
    //End of sound controller initializations

    //Start of control volume with sliders//
    private void initializeVolumeController()
    {
        try{
            whiteVolumeSeekBar = (SeekBar) findViewById(R.id.whiteVolumeSeekBar);
            whiteVolumeSeekBar.setMax(50);
            whiteVolumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
                    float log1 = (float) (Math.log(50-progress)/Math.log(50));
                    whiteNoiseMP.setVolume(1-log1, 1-log1);
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });
            pinkVolumeSeekBar.setProgress(25);
        } catch (Exception e){

        }
        try{
            pinkVolumeSeekBar = (SeekBar) findViewById(R.id.pinkVolumeSeekBar);
            pinkVolumeSeekBar.setMax(50);
            pinkVolumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
                    float log1 = (float) (Math.log(50-progress)/Math.log(50));
                    pinkNoiseMP.setVolume(1-log1, 1-log1);
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });
            pinkVolumeSeekBar.setProgress(25);
        } catch (Exception e){

        }
        try{
            brownVolumeSeekBar = (SeekBar) findViewById(R.id.brownVolumeSeekBar);
            brownVolumeSeekBar.setMax(50);
            brownVolumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
                    float log1 = (float) (Math.log(50-progress)/Math.log(50));
                    brownNoiseMP.setVolume(1-log1, 1-log1);
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });
            brownVolumeSeekBar.setProgress(25);

        } catch (Exception e){

        }

        //end of volume controller

}}

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/numbsound"
    tools:context="com.vaughnx.vaugi.soundwall.MainActivity">

    <ToggleButton
        android:id="@+id/whitenoisebutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textOff="@string/whiteToggleButton"
        android:textOn="@string/whiteToggleButton"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="247dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="16dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <ToggleButton
        android:id="@+id/pinknoisebutton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button"
        android:textOff="@string/pinkToggleButton"
        android:textOn="@string/pinkToggleButton"
        tools:layout_editor_absoluteX="260dp"
        tools:layout_editor_absoluteY="247dp"
        android:layout_marginTop="48dp"
        android:layout_below="@+id/brownnoisebutton"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <ToggleButton
        android:id="@+id/brownnoisebutton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/whitenoisebutton"
        android:layout_marginTop="44dp"
        android:text="Button"
        android:textOff="@string/brownToggleButton"
        android:textOn="@string/brownToggleButton"
        tools:layout_editor_absoluteX="137dp"
        tools:layout_editor_absoluteY="247dp" />

    <SeekBar
        android:id="@+id/whiteVolumeSeekBar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/pinknoisebutton"
        android:layout_marginTop="62dp" />
    <SeekBar
        android:id="@+id/brownVolumeSeekBar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/whiteVolumeSeekBar"
        android:layout_marginTop="62dp" />
    <SeekBar
        android:id="@+id/pinkVolumeSeekBar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/brownVolumeSeekBar"
        android:layout_marginTop="62dp" />

</RelativeLayout>


**************************************************************************
        LogCat Results:
07-09 17:05:52.621: E/AndroidRuntime(3147): FATAL EXCEPTION: main
07-09 17:05:52.621: E/AndroidRuntime(3147): Process: com.vaughnx.vaugi.soundwall, PID: 3147
07-09 17:05:52.621: E/AndroidRuntime(3147): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.vaughnx.vaugi.soundwall/com.vaughnx.vaugi.soundwall.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
07-09 17:05:52.621: E/AndroidRuntime(3147):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3135)
07-09 17:05:52.621: E/AndroidRuntime(3147):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3418)
07-09 17:05:52.621: E/AndroidRuntime(3147):     at android.app.ActivityThread.access$1100(ActivityThread.java:231)
07-09 17:05:52.621: E/AndroidRuntime(3147):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1823)
07-09 17:05:52.621: E/AndroidRuntime(3147):     at android.os.Handler.dispatchMessage(Handler.java:102)
07-09 17:05:52.621: E/AndroidRuntime(3147):     at android.os.Looper.loop(Looper.java:148)
07-09 17:05:52.621: E/AndroidRuntime(3147):     at android.app.ActivityThread.main(ActivityThread.java:7422)
07-09 17:05:52.621: E/AndroidRuntime(3147):     at java.lang.reflect.Method.invoke(Native Method)
07-09 17:05:52.621: E/AndroidRuntime(3147):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
07-09 17:05:52.621: E/AndroidRuntime(3147):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
07-09 17:05:52.621: E/AndroidRuntime(3147): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
07-09 17:05:52.621: E/AndroidRuntime(3147):     at android.content.ContextWrapper.getResources(ContextWrapper.java:92)
07-09 17:05:52.621: E/AndroidRuntime(3147):     at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:81)
07-09 17:05:52.621: E/AndroidRuntime(3147):     at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:549)

You should use MediaPlayer.setVolume instead of Audio Manager to control volume. 您应该使用MediaPlayer.setVolume而不是Audio Manager来控制音量。

package com.vaughnx.vaugi.soundwall;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.ToggleButton;
import android.media.MediaPlayer;

public class MainActivity extends AppCompatActivity {

    private SeekBar whiteVolumeSeekBar;
    private SeekBar pinkVolumeSeekBar;
    private SeekBar brownVolumeSeekBar;
    private int maxVolume;
    private int curVOlume;
    private MediaPlayer whiteNoiseMP;
    private MediaPlayer brownNoiseMP;
    private MediaPlayer pinkNoiseMP;
    private ToggleButton whiteNoiseToggle;
    private ToggleButton brownNoiseToggle;
    private ToggleButton pinkNoiseToggle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Sets up white, brown, and pink noise players. Uses toggle buttons to turn sound on
        //and off.
        whiteNoiseMP = MediaPlayer.create(MainActivity.this, R.raw.whitenoise);
        brownNoiseMP = MediaPlayer.create(MainActivity.this, R.raw.brownnoise);
        pinkNoiseMP = MediaPlayer.create(MainActivity.this, R.raw.pinknoise);
        whiteNoiseToggle = (ToggleButton) findViewById(R.id.whitenoisebutton);
        whiteNoiseToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    // The toggle is enabled
                    whiteNoiseMP.start();
                } else {
                    // The toggle is disabled
                    whiteNoiseMP.pause();
                }
            }
        });
        brownNoiseToggle = (ToggleButton) findViewById(R.id.brownnoisebutton);
        brownNoiseToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    // The toggle is enabled
                    brownNoiseMP.start();
                } else {
                    // The toggle is disabled
                    brownNoiseMP.pause();
                }
            }
        });
        pinkNoiseToggle = (ToggleButton) findViewById(R.id.pinknoisebutton);
        pinkNoiseToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    // The toggle is enabled
                    pinkNoiseMP.start();
                } else {
                    // The toggle is disabled
                    pinkNoiseMP.pause();
                }
            }
        });
       //End of sound controller initializations

       //Start of control volume with sliders//
       try{
           whiteVolumeSeekBar = (SeekBar) findViewById(R.id.whiteVolumeSeekBar);
           whiteVolumeSeekBar.setMax(50);
           whiteVolumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
               @Override
               public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
                   float log1 = (float) (Math.log(50-progress)/Math.log(50));
                   whiteNoiseMP.setVolume(1-log1);
               }

               @Override
               public void onStartTrackingTouch(SeekBar seekBar) {

               }

               @Override
               public void onStopTrackingTouch(SeekBar seekBar) {

               }
           });
           pinkVolumeSeekBar.setProgress(25);
        } catch (Exception e){
            Log.e("Exception", e.getMessage());
        }
        try{
            pinkVolumeSeekBar = (SeekBar) findViewById(R.id.pinkVolumeSeekBar);
            pinkVolumeSeekBar.setMax(50);
            pinkVolumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
                    float log1 = (float) (Math.log(50-progress)/Math.log(50));
                    pinkNoiseMP.setVolume(1-log1);
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });
            pinkVolumeSeekBar.setProgress(25);
        } catch (Exception e){
            Log.e("Exception", e.getMessage());
        }
        try{
            brownVolumeSeekBar = (SeekBar) findViewById(R.id.brownVolumeSeekBar);
            brownVolumeSeekBar.setMax(50);
            brownVolumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
                    float log1 = (float) (Math.log(50-progress)/Math.log(50));
                    brownNoiseMP.setVolume(1-log1);
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });
           brownVolumeSeekBar.setProgress(25);

        } catch (Exception e){
            Log.e("Exception", e.getMessage());
        }
        //end of volume controller
    }
}

I have set 50 as the maximum volume and starting volume to be 50% ie 25. 我将最大音量设置为50,将初始音量设置为50%,即25。

Use setVolume with Mediaplayer instead of AudioManager.For the latest android users, kindly add two arguments on the SetVolume.将 setVolume 与 Mediaplayer 一起使用,而不是 AudioManager。对于最新的 android 用户,请在 SetVolume 上添加两个 arguments。 both for left and right volume.左右音量。

whiteVolumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
           @Override
           public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
               float log1 = (float) (Math.log(50-progress)/Math.log(50));
               whiteNoiseMP.setVolume(1-log1,1-log1);
           }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM