如何使用多个Seekbar(Android)同时控制多个声音的音量?

如何使用多个Seekbar(Android)同时控制多个声音的音量?,android,audio,controls,volume,Android,Audio,Controls,Volume,如何使用多个Seekbar控制同时播放的多个声音的音量?有三个mp3文件同时播放。有三个Seekbar,每个Seekbar进度都应该与其相对声音文件的音量相关。我遇到的问题是,当我移动一个SeekBar时,它控制着所有三种声音的音量 以下是Android代码和XML: /* Created by: Justin Clark Company: VaughnX Date: June 15 2017 Purpose: To block out external sound using white, b

如何使用多个Seekbar控制同时播放的多个声音的音量?有三个mp3文件同时播放。有三个Seekbar,每个Seekbar进度都应该与其相对声音文件的音量相关。我遇到的问题是,当我移动一个SeekBar时,它控制着所有三种声音的音量

以下是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)
/*
创建人:贾斯汀·克拉克
公司:沃恩斯
日期:2017年6月15日
用途:使用白色、棕色和粉色噪音阻挡外部声音。
要执行的操作:-增加棕色和粉色噪波文件的持续时间。
-将seek slider用作应用程序内音量控制器
*/
包com.vaughnx.vaugi.soundwall;
导入android.app.Activity;
导入android.content.Context;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.widget.Button;
导入android.widget.CompoundButton;
导入android.widget.SeekBar;
导入android.widget.TextView;
导入android.widget.ToggleButton;
导入android.media.MediaPlayer;
导入android.media.AudioManager;
公共类MainActivity扩展了活动{
私人SeekBar whiteVolumeSeekBar;
私人SeekBar pinkVolumeSeekBar;
私人SeekBar BrownVolumesekbar;
私人音频经理;
私人音频经理pinkAudioManager;
私人音频经理;
私有int-maxVolume;
私有内曲率;
final MediaPlayer whiteNoiseMP=MediaPlayer.create(this,R.raw.whitenoise);
final MediaPlayer brownNoiseMP=MediaPlayer.create(这个,R.raw.brownnoise);
final MediaPlayer pinkNoiseMP=MediaPlayer.create(this,R.raw.pinknoise);
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
初始化undcontroller();
初始化EvolumeController();
}
//设置白色、棕色和粉色噪音播放器。使用切换按钮打开声音
//然后离开。
public void initializeSoundController(){
ToggleButton whiteNoiseToggle=(ToggleButton)findViewById(R.id.whitenoisebutton);
whiteNoiseToggle.setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
//切换已启用
whiteNoiseMP.start();
}否则{
//切换被禁用
whiteNoiseMP.pause();
}
}
});
ToggleButton brownNoiseToggle=(ToggleButton)findViewById(R.id.brownnoisebutton);
brownNoiseToggle.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener(){
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
//切换已启用
brownNoiseMP.start();
}否则{
//切换被禁用
棕色的停顿();
}
}
});
ToggleButton PinkoiseToggle=(ToggleButton)findViewById(R.id.PinkoiseButton);
PinkoiseToggle.setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
//切换已启用
pinkNoiseMP.start();
}否则{
//切换被禁用
pinkNoiseMP.pause();
}
}
});
}
//声音控制器初始化结束
//使用滑块启动控制音量//
私有void initializeEvolumeController()
{
试一试{
whiteVolumeSeekBar=(SeekBar)findViewById(R.id.whiteVolumeSeekBar);
设置最大值(50);
whiteVolumeSeekBar.setOnSeekBarChangeListener(新的SeekBar.OnSeekBarChangeListener(){
@凌驾
public void onProgressChanged(SeekBar-SeekBar、int-progress、布尔b){
float log1=(float)(Math.log(50进度)/Math.log(50));
whiteNoiseMP.setVolume(1-log1,1-log1);
}
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
}
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
}
});
设置进度(25);
}捕获(例外e){
}
试一试{
pinkVolumeSeekBar=(SeekBar)findViewById(R.id.pinkVolumeSeekBar);
pinkVolumeSeekBar.setMax(50);
PinkVolumesekBar.setOnSeekBarChangeListener(新的SeekBar.OnSeekBarChangeListener(){
@凌驾
public void onProgressChanged(SeekBar-SeekBar、int-progress、布尔b){
float log1=(float)(Math.log(50进度)/Math.log(50));
pinkNoiseMP.setVolume(1-log1,1-log1);
}
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
}
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
}
});
设置进度(25);
}捕获(例外e){
}
试一试{
brownVolumeSeekBar=(SeekBar)findViewById(R.id.brownVolumeSeekBar);
设置最大值(50);
BrownVolumeSekBar.setOnSeekBarChangeListener(新的SeekBar.OnSeekBarChangeListener(){
@凌驾
公共发展
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
    }
}