上面我对Jeffrey Blattman的答案投了更高的票,但下面是完整的代码,它展示了如何将setDataSource与音频文件一起使用,并将其放入应用程序资源(RAW)。还有一些我在旅行中捡到的东西…
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();
}