2017-07-06 2 views
0

Comment puis-je contrôler le volume de plusieurs sons en même temps en utilisant plusieurs SeekBars? Il y a trois fichiers mp3 sont joués en même temps. Il y a trois SeekBars, chaque progression de Seekbar devrait se rapporter au volume de son fichier sonore relatif. Le problème que j'ai est que lorsque je déplace un SeekBar, cela contrôle le volume des trois sons.Comment contrôler le volume de plusieurs sons à la fois en utilisant plusieurs SeekBars (Android)?

Voici le code Android suivi du 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) 

Répondre

0

Vous devez utiliser MediaPlayer.setVolume au lieu de Audio Manager pour contrôler le volume.

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 
    } 
} 

J'ai mis 50 en tant que volume maximum et le volume de départ à 50% à savoir 25.

+0

Votre solution compile si je l'applique, mais se bloque quand je tente de l'exécuter. – Vaugito

+0

Que dit le LogCat à propos du crash? – Ali

+0

J'ai ajouté autant de LogCat qui était en rouge que je pouvais au bas du code. (Appuyez sur la limite de 30000 caractères.) – Vaugito