Nano Hash - криптовалюты, майнинг, программирование

Воспроизведение и пауза в медиаплеере с переменной

Я пытаюсь создать приложение для Android, в котором пользователь может воспроизводить аудиофайлы, помеченные идентификатором из базы данных.

//get id from database and turn it into a string, add letter a, because its a res file
        stringId = "a" + String.valueOf(standard.getId());
        //find playbutton
        final FloatingActionButton play = (FloatingActionButton) findViewById(R.id.play);
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //to be able to feed mediaplayer a variable I put it in another function called playAudio
                playAudio(stringId, true);     }
        });

    final FloatingActionButton pause = (FloatingActionButton) findViewById(R.id.pause);
    play.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            playAudio(stringId, false);     }
    });

PlayAudio выглядит так:

private void playAudio(String nameOfFile, Boolean booleanPlay){
        MediaPlayer mediaPlayer = MediaPlayer.create(this, getResources().getIdentifier(nameOfFile, "raw", getPackageName()));
        if (booleanPlay = true){
            if (!mediaPlayer.isPlaying())
            mediaPlayer.start();
        }
        if (booleanPlay = false){
            mediaPlayer.pause();
        }
    }

Когда я запускаю свой код каждый раз, когда я нажимаю кнопку воспроизведения, он создает новый медиаплеер, который начинает воспроизводиться одновременно с другим медиаплеером, кнопка паузы не работает по той же причине. Я не могу понять, как заставить его работать.


Ответы:


1

Не создавайте новый экземпляр MediaPlayer каждый раз при воспроизведении нового файла. Создайте экземпляр в начале и используйте его повторно:

private static MediaPlayer mediaPlayer = new MediaPlayer ();

При изменении файла для воспроизведения попробуйте этот фрагмент кода:

AssetFileDescriptor afd = getApplicationContext ().getResources ().openRawResourceFd (R.raw.sound);

if (afd != null)
{
    mediaPlayer.reset()
    mediaPlayer.setDataSource(afd.getFileDescriptor (), afd.getStartOffset (), afd.getLength ());
    mediaPlayer.setLooping (true);
    mediaPlayer.prepare ();
    mediaPlayer.start ();
}

Замените R.raw.sound именем файла звука для воспроизведения (это должно быть в папке res/raw) или используйте другой способ ссылки на файл по мере необходимости.

Это работает для меня - проверено на Android 8.1 (целевой). Надеюсь это поможет.

ОТРЕДАКТИРОВАНО ДЛЯ ДОБАВЛЕНИЯ: я только что заметил, что у вас есть неправильные операторы в операторах if(booleanPlay = false) и if (booleanPlay = true). Они должны быть == (сравнение, а не присваивание). И последнее: при выходе вы должны вызвать mediaPlayer.release(), чтобы освободить ресурсы, но вы, вероятно, это знали. Рад, что смог помочь.

17.03.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..