У меня есть приложение с будильником. Пользователь может выбрать мелодию звонка из: мелодии устройства, мелодии будильника приложения, свои собственные c. Какой бы тональный сигнал пользователь не выбрал, 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);
}
}
И у меня в манифесте.
Это как я получу все музыкальные файлы c на устройстве пользователя. Я показываю это как список переключателей. Когда пользователь выбирает один из них, String 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) {
}
}
У меня нет телефона Samsung, поэтому я не могу проверить, что происходит исключение.