【问题标题】:How to mute media using shared pref如何使用共享首选项使媒体静音
【发布时间】:2018-01-20 04:58:42
【问题描述】:

大家好,我的应用程序启动时会播放声音。我想让人们可以从主活动设置屏幕中将其静音。

******使用给出的答案进行编辑****** 所以我在我的主要活动中创建了一个设置方法,现在它启动了一个名为 Main2Activity 的新活动,一旦我让它正常工作,这将是我的设置活动。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater=getMenuInflater();
    inflater.inflate(R.menu.menuitem, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.Settings:

///No longer inflates settings xml.. Starts new settings activity instead
           startactivity(new Intent(MainActivity.this,Main2Activity.class))
            break;
    }
    return super.onOptionsItemSelected(item);
}

接下来我有我的媒体播放器类

public class harropMediaplayer {
MediaPlayer mp;
String media;
public harropMediaplayer(String media){
   this.media = media;
}
public void plysound() {

///My media player is now stored globally as suggested 
    mp = App_Objects.mp;
    String j =
            media.toString();
    Log.i("Url", j);
    try {
        mp.setDataSource(j);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        mp.prepare();
    } catch (IOException e) {
        e.printStackTrace();
    }

        Log.i("Sound playing", "Ok");

        mp.start();
    }

public void stopplying(){

    mp.stop();
    mp.release();
}

正如给出的答案中所建议的那样,我现在很生气,因此可以使用名为 App_Objects 的约束类访问媒体播放器。

    public class App_Objects {

//This is where i store my media player

public static MediaPlayer mp = new MediaPlayer();
}

接下来是我的新 SettingsActivity 替换我的膨胀视图

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    final CheckBox btnradio = findViewById(R.id.btnmute);

    SharedPreferences sharedpreferences = getSharedPreferences("myPreference", Context.MODE_PRIVATE);
    final SharedPreferences.Editor editor = sharedpreferences.edit();
    btnradio.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if (btnradio.isChecked()){

                editor.putBoolean("soundMute", b);
                editor.apply();
                Log.i( "onCheckedChanged: ","Activated");

            }
            else {

                editor.clear();
                editor.apply();

                Log.i("onCheckChanged: ","Deactivated");
            }
        }
    });
}

最后是我的启动声音通过 firebase url 播放的启动声音活动,我再次添加了下面给出的答案。包括静音的方法

 setContentView(R.layout.activity_splash__screen);

    database = FirebaseDatabase.getInstance();
    reference = database.getReference().child("tvthemetunes");

    getthemetune();

}



public void getthemetune() {

    Log.i ("Url Grab ", "Started");
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.i("Url Grab", "Searching database");
            long childrenCount = dataSnapshot.getChildrenCount();
            int count = (int) childrenCount;
            int randomNumber = new Random().nextInt(count);
            //Your random themeTune will be stored here
            for(DataSnapshot snap : dataSnapshot.getChildren())
            {
                int i =  0;

                    if(i == randomNumber)
                {
                    Themetune = snap.getValue(String.class);
                    try {

                        mp = new harropMediaplayer(Themetune);
                        ((TextView) findViewById(R.id.version)).setText("" + getPackageManager().getPackageInfo(getPackageName(), 0).versionName);
                        ImageView view = findViewById(R.id.splash);
                        ImageView view1 = findViewById(R.id.rain);
                        Animation animFadeIn = AnimationUtils.loadAnimation(Splash_Screen.this, R.anim.fadein);
                        animFadeIn.reset();
                        mp.plysound();
 ///HERE IS WHERE I CALL MY NEW METHOD
                         volumeSetting();

                        view1.clearAnimation();
                        view1.startAnimation(animFadeIn);
                        RotateAnimation anim = new RotateAnimation(0.0f, 
360.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

//Setup anim with desired properties
                        anim.setInterpolator(new LinearInterpolator());
                        anim.setRepeatCount(Animation.RELATIVE_TO_SELF); 
//Repeat animation indefinitely
                        anim.setDuration(1200); //Put desired duration per anim cycle here, in milliseconds

//Start animation
                        view.startAnimation(anim);

                    } catch (PackageManager.NameNotFoundException e) {
                        e.printStackTrace();
                    }


                    int secondsDelayed = 2;
                    new Handler().postDelayed(new Runnable() {
                        public void run() {


                            startActivity(new Intent(Splash_Screen.this, 
 MainActivity.class));
                            finish();
                            mp.stopplying();

                        }
                    }, secondsDelayed * 2000);



                    break;
                }

            }

            }





        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

 private void volumeSetting(){

////MY NEW VOLUME MUTE METHOD INCLUDING THE FETCH SHARED PREF
    SharedPreferences sharedpreferences = getSharedPreferences("myPreference", Context.MODE_PRIVATE);

    boolean bnSoundMute = sharedpreferences.getBoolean("soundMute",true);

    if(bnSoundMute){
        App_Objects.mp.setVolume(0,0); // for Mute
    }else{
        App_Objects.mp.setVolume(1,1);// for Unmute or full volume
    }
}
}

但是现在声音接缝被静音了。从一开始,如果我转到我的设置活动并单击静音启动复选框,然后重新启动应用程序。该应用程序崩溃了,在我的控制台中给了我致命的伤害

AndroidRuntime: FATAL EXCEPTION: main
                                                                                    Process: h20music.p9p.harrop99.H20DroidApp_Amazon, PID: 2549
                                                                                    java.lang.IllegalStateException
                                                                                        at android.media.MediaPlayer.nativeSetDataSource(Native Method)
                                                                                        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1078)
                                                                                        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1039)
                                                                                        at h20music.p9p.harrop99.H20DroidApp_Amazon.harropMediaplayer.plysound(harropMediaplayer.java:29)
                                                                                        at h20music.p9p.harrop99.H20DroidApp_Amazon.Splash_Screen$1.onDataChange(Splash_Screen.java:84)
                                                                                        at com.google.android.gms.internal.zzeeq.zza(Unknown Source)
                                                                                        at com.google.android.gms.internal.zzegl.zzbwe(Unknown Source)
                                                                                        at com.google.android.gms.internal.zzegr.run(Unknown Source)
                                                                                        at android.os.Handler.handleCallback(Handler.java:751)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                        at android.os.Looper.loop(Looper.java:154)
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

【问题讨论】:

    标签: java android sharedpreferences


    【解决方案1】:

    我知道你想要做什么。您可以通过将媒体播放器声明为静态来实现。以下是您可以实现此目的的一种方法,您可以很好地构建此代码。详细代码我没有写。

    创建AppConstants 类并静态定义MediaPlayer

    public class AppConstants{
    
        public static MediaPlayer mp = new MediaPlayer();
    
    }
    

    创建SettingActivity Activity 类,您可以在其中为 soundMute 选项设置 sharedpreference 值 true/false。

    public class SettingActivity{
    
        SharedPreferences sharedpreferences = getSharedPreferences("myPreference", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedpreferences.edit();
    
    
        btnradio.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
    
                editor.putBoolean("soundMute", b);
                editor.apply();
    
            }
        });
    
    }
    

    创建SplashActivity Activity 类,您可以在其中读取是否共享媒体播放器静音。

    public class SplashActivity{
    
        SharedPreferences sharedpreferences = getSharedPreferences("myPreference", Context.MODE_PRIVATE);
    
        boolean bnSoundMute = sharedpreferences.getBoolean("soundMute",true);
    
        if(bnSoundMute){
            AppConstants.mp.setVolume(0,0); // for Mute
        }else{
            AppConstants.mp.setVolume(1,1); // for Unmute or full volume
        }
    
        try {
            AppConstants.mp.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        AppConstants.mp.start();
    
    } 
    

    【讨论】:

    • 什么是appconstants类vatsal?
    • 它只是一个普通的类,就像它的名字一样,我们可以在一个类中定义 app 的所有常量变量。如果您想在整个应用程序中使用 MediaPlayer 的实例,那么您可以使用它,也可以在本地定义它。
    • @VatsalDesai 谢谢老兄,但我试过你的答案,它似乎让我的应用程序崩溃。我编辑了我的帖子以显示您的答案。任何帮助都会非常感谢
    • @Valentin Michalak 有什么帮助吗?
    • 您无法清除共享首选项,否则您无法访问“soundMute”键,它位于 OnCheckedChangeListener 中。什么是btnradio。是 RadioGroup 不是 RadioButton,请尝试使用 RadioGroup,因为单个 RadioButton 将变得难以检查条件。
    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多