我做了很多谷歌搜索,但其他解决方案对我不起作用。
我的目标是在闹钟频道上按需播放声音 (因此通过警报音量设置调整音量)
从这个thread我构建了以下代码
mediaPlayerScan = MediaPlayer.create(getContext(), 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);
}
它仍在音乐频道播放。 (在音乐设置中调整IE音量而不是警报)
我的直觉是我错过了许可或其他什么,但我还没有找到这样的许可。
我在Google Pixel 1上进行测试
谢谢,
森
修改
感谢@ jeffery-blattman,以下代码适用于我
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();
}
答案 0 :(得分:5)
问题是create()
将MediaPlayer
置于不接受属性的状态(它为您调用prepare()
)。您需要使用更详细的创建播放器的机制。
final MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(...);
AudioAttributes attrs = new AudioAttributes.Builder().setUsage(usage).build();
mediaPlayer.setAudioAttributes(attrs);
new AsyncTask<Void,Void,Boolean>() {
@Override
protected Boolean doInBackground(Void... voids) {
try {
mediaPlayer.prepare();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onPostExecute(Boolean prepared) {
if (prepared) {
mediaPlayer.start();
}
}
}.execute();
答案 1 :(得分:2)
我对上面的Jeffrey Blattman的回答表示赞同,但这是完整的代码,显示了如何将setDataSource与放置到应用程序资源中的音频文件一起使用(原始)。还有我在旅途中发现的其他几件事...
static public void playAlarmSound () {
final MediaPlayer mediaPlayer = new MediaPlayer();
new AsyncTask<Void, Void, Boolean>() {
@Override
protected Boolean doInBackground(Void... voids) {
try {
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayer.reset();
mediaPlayer.release();
}
});
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
AssetFileDescriptor afd = getContext().getResources().openRawResourceFd(R.raw.nameofyourresource);
if (afd == null) return false;
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
if (Build.VERSION.SDK_INT >= 21) {
mediaPlayer.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
} else {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
}
mediaPlayer.setVolume(1.0f, 1.0f);
mediaPlayer.prepare();
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}.execute();
}