MediaPlayer не воспроизводит выбранную мелодию на устройствах Samsung - PullRequest
0 голосов
/ 14 марта 2020

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

1 Ответ

0 голосов
/ 16 марта 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...