5

class を使用して音楽ストリームをミュート/ミュート解除する小さなアプリを作成しましたAudioManager。実際、アプリケーションを閉じるまで機能します。つまり、ストリームをミュートし、アプリを閉じ、アプリを再起動しても、ボタンでストリームのミュートが解除されなくなりました。ネットで検索しましたが、誰もこの問題に遭遇していないようです。

これが私のコードです:

public class ControlloVolume extends Activity {
ToggleButton tb_mute;
Button btn_mute;
AudioManager mAudioManager;
boolean mute;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_controllo_volume);

    tb_mute = (ToggleButton) findViewById(R.id.tb_mute);
    btn_mute = (Button) findViewById(R.id.btn_mute);
    mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

    if(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)==0){
        mute = true;
        tb_mute.setChecked(mute);
    }else{
        mute = false;
        tb_mute.setChecked(mute);
    }

    }

public void onButtonClicked(View view){
    if(!mute){
        mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, true);
        tb_mute.setChecked(true);
        mute = true;
    }else{
        mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, false);
        tb_mute.setChecked(false);
        mute = false;
    }
}
4

1 に答える 1

0

まず、推奨されていないことに注意してください

ユーザー エクスペリエンスを向上させるために、アプリケーションは onPause() でミュートされたストリームのミュートを解除し、必要に応じて onResume() で再度ミュートする必要があります。

しかし、私はあなたが何をしているのか知っていると思います。

setStreamMuteのドキュメントのこの行に注意してください

ミュート コマンドは、クライアント プロセスの停止から保護されています。ストリーム上でアクティブなミュート要求を持つプロセスが停止した場合、このストリームは自動的にミュート解除されます。

デバイスを確認しましたが、アクティビティを終了しても、ストリームはミュートのままです。しかし、プロセスを強制終了するとすぐに、ミュートが消えます。アクティビティのライフサイクルを見てください。

現在のアプローチは確実に機能しないため、ミュートをトリガーするフォアグラウンド サービスを作成し、アクティビティからそのサービスを開始できます。また、おそらくsetStreamSoloが必要になるでしょう。

2つの重要なこと。

  1. Volume==0muted同じではありません。つまり、ストリームは volume==0 にすることができますが、ミュートすることはできません。ただし、ストリームミュートされている場合、音量は常に 0 になります
  2. ミュート要求は累積的です。つまり、ミュートを 2 回設定した場合は、ミュートも 2 回解除する必要があります。コードはそれを処理しません。

余談ですが、そのようなアプリでは、アクティビティの代わりにウィジェットを使用することをお勧めします。


オフトピック。驚くべきことに、ブーリアンがどのように機能するかを理解していない人が多いようです。そして、あなたのようなコードを定期的に見ているので、ここでは少し合理化された書き直しがあります。

@Override
public void onCreate(Bundle savedInstanceState) {
    // ... setup just like you did

    // boolean is just like any other type. You can assign not only
    // constants, but expressions too
    mute = (mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)==0);
    tb_mute.setChecked(mute);
}

public void onButtonClicked(View view){
    mute = !mute; // invert value
    mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, mute);
    tb_mute.setChecked(mute);
}
于 2014-06-19T08:51:02.173 に答える