15

次のコードを使用して、アプリケーションでメディア プレーヤーのオーディオ ストリームを設定しようとしましたが、これを行うとエミュレータで音が聞こえません。プレーヤーのストリームを設定しないと、オーディオは正常に再生されます。私はこれを間違って使用していると確信していますが、どのようにトレーニングすることができませんか?

MediaPlayer player = MediaPlayer.create(getApplicationContext(), R.raw.test_audio);

AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.start();

注: MODIFY_AUDIO_SETTINGS パーミッションを既にマニフェストに追加しました。

ありがとう!

4

5 に答える 5

28

なぜこれが起こるのかわかりませんが、以下のコードは機能します。setDataSource()ではなく でデータ ソースを設定する必要がありますcreate()

このコードは機能します:

MediaPlayer mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setDataSource(this,Uri.parse("android.resource://PACKAGE_NAME/"+R.raw.soundfile));
mp.prepare();
mp.start();

このコードは機能しません:

MediaPlayer mp = MediaPlayer.create(this, R.raw.soundfile);
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.prepare();
mp.start();
于 2011-11-30T02:43:46.453 に答える
6

問題はMediaPlayer.create()、MediaPlayer の作成に使用していることです。Create関数は、メディアをファイナライズする関数を呼び出し、prepare()変更を許可しませんAudioStreamType

ソリューションはsetDataSource代わりに使用していますcreate

MediaPlayer mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setLooping(true);
try {
   mp.setDataSource(getApplicationContext(), yourAudioUri);
   mp.prepare();
} catch (IOException e) {
   e.printStackTrace();
}
mp.start();

詳細については、このリンクを参照してください。

于 2017-01-04T00:38:50.213 に答える
2

1.setAudioStreamType(int ストリームタイプ)

prepare() の前にこのメソッドを呼び出す必要があります。

2. MediaPlayer.create(Context context, int resid)

成功すると、prepare() はすでに呼び出されているため、再度呼び出してはなりません。

于 2013-07-17T11:21:56.743 に答える
2

ここでのソリューションは、API 22 で非推奨になりました

私はこれを理解するために自分のスレッドを開きました。

これは、更新された実用的なソリューションです。

mediaPlayerScan = new MediaPlayer();
try {
  mediaPlayerScan.setDataSource(getContext(),
          Uri.parse(getString(R.string.res_path) + R.raw.scan_beep));

  if (Build.VERSION.SDK_INT >= 21) {
    mediaPlayerScan.setAudioAttributes(new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_ALARM)
            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
            .build());
  } else {
    mediaPlayerScan.setAudioStreamType(AudioManager.STREAM_ALARM);
  }
  mediaPlayerScan.prepare();
} catch (IOException e) {
  e.printStackTrace();
}
于 2018-06-15T20:04:23.403 に答える
0

次のことを試してください。

player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.prepare();
player.start();

そして、なぜ「audioManager.getStreamVolume(AudioManager.STREAM_ALARM);」を呼び出しているのですか? 値は変数に格納されないため、かなり役に立ちません;)

それが役に立ったことを願っています

于 2011-08-14T15:09:06.157 に答える