我有一个闹钟应用。允许用户从以下设备中选择铃声:设备铃声,应用闹钟铃声,自己的音乐。用户选择的任何声音,MediaPlayer都会播放默认声音,而不是所选声音。仅在Samsung设备上会出现此问题。
[当用户想要更改警报音时,我要求许可:
alarmToneLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int currentAPIVersion = Build.VERSION.SDK_INT;
if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(AlarmEditActivity.this,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(AlarmEditActivity.this, new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE}, 31);
} else {
showAlarmToneDialog();
}
} else {
showAlarmToneDialog();
}
}
});
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 31:
showAlarmToneDialog();
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
而且我有清单。
这是我在用户设备上获取所有音乐的方式。我将其显示为单选按钮列表。当用户选择其中之一时,将保存字符串uriForTheSong。
private TreeMap<String,String> getAllMusic(){
ContentResolver cr = this.getActivity().getContentResolver();
TreeMap<String, String> listOfAllSongsWithUri = new TreeMap<>();
String[] projection = {
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.ALBUM
};
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
Cursor cursor = cr.query(uri, projection, selection, null, sortOrder);
int count = 0;
if(cursor != null)
{
count = cursor.getCount();
if(count > 0)
{
while(cursor.moveToNext())
{
String uriOfTheSong = cursor.getString(0);
String nameOfTheSong = cursor.getString(1);
listOfAllSongsWithUri.put(nameOfTheSong, uriOfTheSong);
}
}
}
cursor.close();
return listOfAllSongsWithUri;
}
当警报响起时,AlarmToneActivity启动并播放声音。如果发生异常,MediaPlayer将使用默认的uri(AMAZING_GRACE_URI)
void playSound(Context context, String alarmToneUriString) throws IllegalArgumentException,
SecurityException,
IllegalStateException,
IOException {
Uri alarmToneUri = Uri.parse(alarmToneUriString);
try {
mPlayer.setDataSource(context, alarmToneUri);
} catch (Exception e){
alarmToneUri = Uri.parse(AMAZING_GRACE_URI);
mPlayer.setDataSource(context, alarmToneUri);
}
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
if(SharedPref.getGradualVolumeSetting()){
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), 0);
}
playerStart();
}
}
void playerStart(){
try {
mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mPlayer) {
mPlayer.start();
}
});
mPlayer.prepareAsync();
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
mPlayer.start();
}
});
} catch (IllegalStateException e) {
}
}
我没有三星手机,所以我无法检查发生了什么异常。
我在您的代码中看不到。您是否检查了媒体播放器(here)的生命周期?在setDatasource
之前重置Mediaplayer。