2

I am quite new to android and currently working on a quiz app in which I have sounds that play when users are using the app. I have a switch button in my settings activity in which should toggle sounds for the application on and off. I have implemented some logic but it ain't working yet. I have exhausted the much I know and I need some help.

style.xml

 <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:soundEffectsEnabled">true</item>
    </style>
    <style name="AppThemeMute" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:soundEffectsEnabled">false</item>
    </style>

MyApplication.java

public class MyApplication extends Application {

    private static int sTheme;

    public final static int THEME_SOUND_ON = 0;
    public final static int THEME_SOUND_OFF = 1;



    @Override
    public void onCreate() {
        super.onCreate();
    }

    public static void changeToTheme(Context context, int theme) {
        sTheme = theme;

        switch (sTheme) {
            default:
            case THEME_SOUND_ON:
                context.setTheme(R.style.AppTheme);
                break;
            case THEME_SOUND_OFF:
                context.setTheme(R.style.AppThemeMute);
                break;
        }
    }
}

SettingsActivity.java

public class SettingsActivity extends AppCompatActivity {
    private Switch mSoundSwitch;
    private  Switch mAdsSwitch;
    SharedPreferences sharedPreferences;
    SharedPreferences.Editor editor;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        // handling switch button
        mSoundSwitch = (Switch) findViewById(R.id.soundSwitch);
        mSoundSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
    sharedPreferences =  getPreferences(Context.MODE_PRIVATE);
    editor = sharedPreferences.edit();
    editor.putBoolean("sound", true);
    editor.apply();
    // Change Whole App Theme
    MyApplication.changeToTheme(getApplicationContext(), MyApplication.THEME_SOUND_ON);
} else {
    sharedPreferences =  getPreferences(Context.MODE_PRIVATE);
    editor = sharedPreferences.edit();
    editor.putBoolean("sound", false);
    editor.apply();
    MyApplication.changeToTheme(getApplicationContext(), MyApplication.THEME_SOUND_OFF);
}
            }
        });

        sharedPreferences = getPreferences(Context.MODE_PRIVATE);
        boolean isChecked = sharedPreferences.getBoolean("sound", true);
        mSoundSwitch.setChecked(isChecked);

    }

}

For now the switch button works perfectly with sharedPreferences. However, the sounds are not muted when the button is toggled.

Ben Ajax
  • 668
  • 2
  • 13
  • 27
  • I think you have t recreate your current activity may work. use `recreate()` in before ending of your `changeToTheme` method – UltimateDevil Oct 09 '17 at 11:37
  • or if this not work for you then check [here](https://stackoverflow.com/questions/14031399/issue-with-unmute-button-java-android) – UltimateDevil Oct 09 '17 at 11:39
  • 1
    See https://stackoverflow.com/questions/10895882/mute-the-global-sound-in-android – Robert Oct 09 '17 at 11:40
  • I thinks setting theme will not work. You should get your music service in place of your changeToTheme() method. There you can control your application music with music service object. – Raghu Mudem Oct 09 '17 at 13:54

1 Answers1

1
private void mute() {
    //mute audio
    AudioManager amanager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    amanager.setStreamMute(AudioManager.STREAM_NOTIFICATION, true);
}

public void unmute() {
    //unmute audio
    AudioManager amanager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    amanager.setStreamMute(AudioManager.STREAM_NOTIFICATION, false);
}

This two function can handle the audio mute and unmute quite well.

You can simply give toggle / switch to mute or unmute according to user preference.

Akshay Katariya
  • 1,464
  • 9
  • 20