5

ドキュメントでは、次のように述べられています。

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

特定のストリームのミュート要求は累積的です。AudioManagerは1つ以上のクライアントから複数のミュート要求を受信でき、同じ数のミュート解除要求が受信された場合にのみストリームのミュートが解除されます。

さて、最初の段落は本当です。プロセスが停止するたびに、ミュートしたすべてのストリームが自動的にミュート解除されます。しかし、何度呼んsetStreamMute(someStream, false)でも、決してミュートを解除することはありません。前回、1回だけミュートした後、100万回以上呼び出してみましたが、何も起こりません。

ちなみに、同じ方法でミュートを解除すると、ミュートされたままになります。しかし、同じメソッドへの次の呼び出しでは、ミュートが解除されることはありません。

アラームマネージャーの使用を開始するBroadcastReceiveronReceiveメソッドでミュートしています。それで、ミュート呼び出しとミュート解除呼び出しの間の間に私のアプリが強制終了されたためかもしれませんか?(しかし、私のアプリはまだRAMに残っています)

この問題は、AlarmManagerへの参照を保持していないことが原因である可能性があります(毎回異なるインスタンスを取得していますか?)

誰かがこの問題に遭遇しましたか?

4

4 に答える 4

21

どうやら、これらの Android バージョンにはバグがあります。バージョン 2.2 および 2.3.3 でテスト済みで、バグが存在します。setStreamMuteAudioManager オブジェクトを呼び出すと、次のようになります。

AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(...., true);

参照を失い、新しい参照を取得します。

am = null;
am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);

今は何度電話してもミュート解除されません。am.setStreamMute(..., false)

今このバグを報告するのは悪いと思います..

レッスン: AudioManager への静的参照を保持します。

@Michell Bak、Androidソフトウェアのバグかどうかを確認するアイデアをくれてありがとう:)私はこのことにあまりにも長い間立ち往生しており、それが私のせいではないかどうかを確認する考えはありませんでした.

于 2011-10-28T12:19:06.903 に答える
1

アプリケーションにオーディオマネージャー変数を配置することで問題を解決します

   public class myApplication extends Application {


  static AudioManager am;
      public void onCreate() {
    super.onCreate();
    am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    this.setMute(false);
      }
    }

次に、アクティビティ クラスに次の関数を追加します。

private AudioManager getAM() {
return ((elpApplication)getApplication()).am;

}

getAM(); の使い方は次のとおりです。

private void toogleMediaPlayerMute() {

    //defaultVolumn = am.getStreamVolume(AudioManager.STREAM_MUSIC);
    elpApplication app = getElpApp();
    Log.d("appmute", String.valueOf(app.isMute()));
    if (!app.isMute()) {
        getAM().setStreamVolume(AudioManager.STREAM_MUSIC, 0,
                AudioManager.FLAG_PLAY_SOUND);
        getAM().setStreamMute(AudioManager.STREAM_MUSIC, true);
        ismute = true;

    } else {
        int maxVolume = getAM().getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        Log.d("maxvol", String.valueOf(maxVolume));
        getAM().setStreamMute(AudioManager.STREAM_MUSIC, false);
        getAM().setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume,
                AudioManager.FLAG_SHOW_UI);

        ismute = false;
        // app.setMute(ismute);
    }
    app.setMute(ismute);
}
于 2012-12-31T10:55:41.190 に答える
1

私は以前にその API を使用したことはありませんが、簡単な Google 検索でいくつかの結果が返され、機能しませんでした。Android 2.3 にまだ存在するバグのようです。

http://code.google.com/p/android/issues/detail?id=4235

于 2011-10-26T21:12:33.730 に答える
0

API の新しいバージョンでも同じ問題が発生しています。そこで、この問題を回避するために、私は少し「昔ながらの」ソリューションを実装しました。バイト ストリームの取得/バイト ストリームの直接送信を処理するような設計の場合、ミュートが選択されている場合は、ゼロで埋められたバイト配列を送信します。

...
byte[] whatToSend = realByteData;
byte [] mutedOutput = new byte[recBuffSize];
Array.setByte( mutedOutput, 0, (byte) 0);
...
if ( muteSet )
  whatToSend = mutedOutput;

amountWritten = audioTrack.write(whatToSend, 0, amountRead);

*

于 2015-02-13T03:28:08.853 に答える