Search code examples
androidandroid-studiosharedpreferences

SharedPreferences issue in Android Studio



I'm trying since 2 days and have exhaustively tried various things but I'm not able to get this work. Kindly help.
I have an Android Studio provided default Settings page where I have kept only 1 SwitchPreference where I intend to play or pause background music on all activities depending upon the Switch position.

This is my Audio class.

public class AudioPlay {
    public static MediaPlayer mediaPlayer;
    private static SoundPool soundPool;
    public static boolean isplayingAudio=false;
    public static void playAudio(Context c, int id){
        mediaPlayer = MediaPlayer.create(c,id);
        soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
        if(!mediaPlayer.isPlaying())
        { isplayingAudio=true; mediaPlayer.start(); }
    }
    public static void stopAudio(){ isplayingAudio=false; mediaPlayer.stop(); }
    public static void pauseAudio() {isplayingAudio=false;mediaPlayer.pause();}
    public static void resumeAudio() {isplayingAudio=true;mediaPlayer.start();}
}


and this is my Settings class.

public class SettingsActivity extends AppCompatActivity {

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

        AudioPlay.playAudio(getBaseContext(),R.raw.app_bg_music);
        AudioPlay.mediaPlayer.setLooping(true);

        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_pref, new SettingsFragment())
                .commit();
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); }

        SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
        sharedPrefs.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                boolean test = sharedPreferences.getBoolean("play_music", false);
                if(test) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
                else {AudioPlay.pauseAudio();}
            }
        });
    }

    public static class SettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
        { setPreferencesFromResource(R.xml.root_preferences, rootKey); }
    }

    @Override
    protected void onPause() {
        super.onPause();
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        boolean isChecked = sharedPreferences.getBoolean("play_music", false);
        if(isChecked) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
        else {AudioPlay.pauseAudio();}
    }

    @Override
    protected void onResume() {
        super.onResume();
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        boolean isChecked = sharedPreferences.getBoolean("play_music", false);
        if(isChecked) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
        else {AudioPlay.pauseAudio();}
    }
}


and to start with, I'm calling the SharedPreference from OnPause and OnResume methods in MainActivity as well as from Settings class.

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean isChecked = sharedPreferences.getBoolean("play_music", false);
if(isChecked) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.pauseAudio();}

Solution

  • I think, I fixed it myself.
    Multiple tests doesn't show any problem.
    Please let me know if this could be done in a better way.

    My Settings Fragment class

    public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
        SharedPreferences sharedPreferences;
    
        @Override
        public void onCreatePreferences(Bundle bundle, String rootKey) {
            addPreferencesFromResource(R.xml.root_preferences);
            sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
        }
    
        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            if(key.equals("sync")){
                boolean on = sharedPreferences.getBoolean("sync", false);
                if(on){
                    Toast.makeText(getActivity(), "Switch enabled", Toast.LENGTH_SHORT).show();
                    if(AudioPlay.mediaPlayer == null) { AudioPlay.playAudio(getContext(),R.raw.app_bg_music_orig); AudioPlay.mediaPlayer.setLooping(true);}
                    else {AudioPlay.resumeAudio();}
                }
                else {
                    Toast.makeText(getActivity(), "Switch disabled", Toast.LENGTH_SHORT).show();
                    if(AudioPlay.mediaPlayer == null) { Log.i("Switch position",""+on); }
                    else {AudioPlay.pauseAudio();}
                }
            }
        }
    
        @Override
        public void onStart() {
            super.onStart();
            getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
        }
    
        @Override
        public void onStop() {
            super.onStop();
            getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
        }
    }
    


    My Settings class

    public class SettingsActivity extends AppCompatActivity {
        SharedPreferences.OnSharedPreferenceChangeListener listener;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.settings_activity);
            getSharedPreferences("sync",MODE_PRIVATE).registerOnSharedPreferenceChangeListener(listener);
    
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.settings, new SettingsFragment())
                    .commit();
    
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            boolean my_bg_music = preferences.getBoolean("sync",true);
            if(my_bg_music){
                if(AudioPlay.mediaPlayer == null) { AudioPlay.playAudio(this,R.raw.app_bg_music_orig); AudioPlay.mediaPlayer.setLooping(true);}
                else {AudioPlay.resumeAudio();}
            }
            else{
                if(AudioPlay.mediaPlayer == null) { Log.i("Switch position",""+my_bg_music); }
                else {AudioPlay.pauseAudio();}
            }
        }
        @Override
        public void onResume() {
            getSharedPreferences("sync",MODE_PRIVATE).registerOnSharedPreferenceChangeListener(listener);
            super.onResume();
        }
    
        @Override
        public void onPause() {
            getSharedPreferences("sync",MODE_PRIVATE).unregisterOnSharedPreferenceChangeListener(listener);
            super.onPause();
        }
    }