MediaPlayer не воспроизводит выбранную мелодию на устройствах Samsung

У меня есть приложение будильник. Пользователю разрешено выбирать мелодию звонка из: мелодий звонка устройства, мелодий будильника приложения, собственной музыки. Какой бы тон ни выбрал пользователь, 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);
        }
    }

А у меня в манифесте.

Вот как я получаю всю музыку на устройстве пользователя. Я показываю это как список переключателей. Когда пользователь выбирает один из них, 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, поэтому я не могу проверить, какое исключение возникает.


person Patrycja_89    schedule 14.03.2020    source источник
comment
Crashlytics показывает какую-либо ошибку?   -  person GGK    schedule 15.03.2020
comment
нет. Об этом сообщили несколько пользователей приложения.   -  person Patrycja_89    schedule 15.03.2020


Ответы (1)


Я не вижу этого в вашем коде. Проверяли ли вы жизненный цикл медиаплеера (здесь)? сбросить Mediaplayer до setDatasource.

person Alejandro Gomez    schedule 16.03.2020
comment
Да. Я не понимаю, какое это имеет значение. Проблема в том, что играет неправильный рингтон (по умолчанию вместо того, который выбрал пользователь). Я думаю, что происходит одно из исключений (IllegalArgumentException, SecurityException, IllegalStateException, IOException) - person Patrycja_89; 16.03.2020
comment
потому что ваш медиаплеер не смог выпустить воспроизводимый файл и, следовательно, вы не могли переключиться на новый аудиофайл. Как написал @GGK, попробуйте поймать ошибку (которую Вы подозреваете) с помощью Crashlytics.log - person Alejandro Gomez; 17.03.2020