Поиск…


Синтаксис

  • void setAudioStreamType (int streamtype)
  • void setDataSource (контекст контекста, Uri uri)
  • void prepare ()
  • void prepareAsync ()
  • void start ()
  • void stop ()

замечания

Использование MediaPlayer в основном основано на диаграмме состояний:

введите описание изображения здесь

Это означает, что для воспроизведения аудио / видео должна выполняться определенная последовательность действий, это конкретный порядок. В нем также указывается, какие действия можно предпринять в каком состоянии .

API MediaPlayer не обладает гибкостью (добавляет пользовательский декодер и визуализацию) и не имеет sSupport для динамической адаптивной потоковой передачи через HTTP (DASH) и SmoothStreaming. Для этого загляните в ExoPlayer .

Базовое создание и воспроизведение

Класс MediaPlayer может использоваться для управления воспроизведением аудио / видео файлов и потоков.

Создание объекта MediaPlayer может быть трех типов:

  1. Средства массовой информации из местных ресурсов

    MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.resource);
    mediaPlayer.start(); // no need to call prepare(); create() does that for you
    
  2. Из локального URI (полученного от ContentResolver)

    Uri myUri = ....; // initialize Uri here
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setDataSource(getApplicationContext(), myUri);
    mediaPlayer.prepare();
    mediaPlayer.start();
    
  3. Из внешнего URL-адреса

    String url = "http://........"; // your URL here
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setDataSource(url);
    mediaPlayer.prepare(); // might take long! (for buffering, etc)
    mediaPlayer.start();
    

Асинхронная подготовка

MediaPlayer$prepare() является блокирующим вызовом и блокирует пользовательский интерфейс до завершения выполнения. Для решения этой проблемы можно использовать MediaPlayer$prepareAsync() .

mMediaPlayer = ... // Initialize it here
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
    @Override
    public void onPrepared(MediaPlayer player) {
        // Called when the MediaPlayer is ready to play
        mMediaPlayer.start();
    }
}); // Set callback for when prepareAsync() finishes
mMediaPlayer.prepareAsync(); // Prepare asynchronously to not block the Main Thread

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

mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener(){
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            // ... react appropriately ...
            // The MediaPlayer has moved to the Error state, must be reset!
            // Then return true if the error has been handled
        }
});

Получение системных мелодий

В этом примере показано, как получить URI для системных рингтонов ( RingtoneManager.TYPE_RINGTONE ):

private List<Uri> loadLocalRingtonesUris() {
        List<Uri> alarms = new ArrayList<>();
        try {
            RingtoneManager ringtoneMgr = new RingtoneManager(getActivity());
            ringtoneMgr.setType(RingtoneManager.TYPE_RINGTONE);

            Cursor alarmsCursor = ringtoneMgr.getCursor();
            int alarmsCount = alarmsCursor.getCount();
            if (alarmsCount == 0 && !alarmsCursor.moveToFirst()) {
                alarmsCursor.close();
                return null;
            }

            while (!alarmsCursor.isAfterLast() && alarmsCursor.moveToNext()) {
                int currentPosition = alarmsCursor.getPosition();
                alarms.add(ringtoneMgr.getRingtoneUri(currentPosition));
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return alarms;
    }

Список зависит от типа запрошенных мелодий звонка. Возможности:

  • RingtoneManager.TYPE_RINGTONE
  • RingtoneManager.TYPE_NOTIFICATION
  • RingtoneManager.TYPE_ALARM
  • RingtoneManager.TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM


Чтобы получить Ringtones как android.media.Ringtone каждый Uri должен быть разрешен RingtoneManager :

android.media.Ringtone osRingtone = RingtoneManager.getRingtone(context, uri);

Чтобы воспроизвести звук, используйте метод:

public void setDataSource(Context context, Uri uri)

от android.media.MediaPlayer . MediaPlayer должен быть инициализирован и подготовлен в соответствии с диаграммой состояний

Получение и настройка объема системы

Типы аудиопотоков

Существуют различные профили потоков рингтонов. Каждый из них имеет разный объем.

Каждый пример здесь написан для AudioManager.STREAM_RING потока AudioManager.STREAM_RING . Однако это не единственный. Доступные типы потоков:

  • STREAM_ALARM
  • STREAM_DTMF
  • STREAM_MUSIC
  • STREAM_NOTIFICATION
  • STREAM_RING
  • STREAM_SYSTEM
  • STREAM_VOICE_CALL


Настройка громкости

Чтобы получить объем определенного профиля, звоните:

AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);

Это значение очень мало полезно, когда максимальное значение для потока неизвестно:

AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int streamMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);

Отношение этих двух значений даст относительный объем (0 <объем <1):

float volume = ((float) currentVolume) / streamMaxVolume


Регулировка громкости на один шаг

Чтобы увеличить громкость для потока выше на один шаг, вызовите:

AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_RAISE, 0);

Чтобы уменьшить громкость для потока на один шаг, вызовите:

AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_LOWER, 0);


Настройка MediaPlayer для использования определенного типа потока

Для этого есть вспомогательная функция класса MediaPlayer .
Просто вызовите void setAudioStreamType(int streamtype) :

MediaPlayer mMedia = new MediaPlayer();
mMedia.setAudioStreamType(AudioManager.STREAM_RING);

Медиаплеер с ходом и положением воспроизведения буфера

public class SoundActivity extends Activity  {
 
    private MediaPlayer mediaPlayer;
    ProgressBar progress_bar;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tool_sound);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        progress_bar = (ProgressBar) findViewById(R.id.progress_bar);
   
        btn_play_stop.setEnabled(false);
        btn_play_stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mediaPlayer.isPlaying()) {
                    mediaPlayer.pause();
                    btn_play_stop.setImageResource(R.drawable.ic_pause_black_24dp);
                } else {
                    mediaPlayer.start();
                    btn_play_stop.setImageResource(R.drawable.ic_play_arrow_black_24px);
                }
            }
        });

        mediaPlayer.setDataSource(proxyUrl);
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                observer.stop();
                progress_bar.setProgress(mp.getCurrentPosition());
                // TODO Auto-generated method stub
                mediaPlayer.stop();
                mediaPlayer.reset();
            }
        });
        mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
            @Override
            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                progress_bar.setSecondaryProgress(percent);
            }
        });
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                btn_play_stop.setEnabled(true);

            }
        });
        observer = new MediaObserver();
        mediaPlayer.prepare();
        mediaPlayer.start();
        new Thread(observer).start();
    }

   
    private MediaObserver observer = null;

    private class MediaObserver implements Runnable {
        private AtomicBoolean stop = new AtomicBoolean(false);

        public void stop() {
            stop.set(true);
        }

        @Override
        public void run() {
            while (!stop.get()) {
                progress_bar.setProgress((int)((double)mediaPlayer.getCurrentPosition() / (double)mediaPlayer.getDuration()*100));
                try {
                    Thread.sleep(200);
                } catch (Exception ex) {
                    Logger.log(ToolSoundActivity.this, ex);
                }

            }
        }
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mediaPlayer.stop();
    }
}

<LinearLayout
    android:gravity="bottom"
    android:layout_gravity="bottom"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:weightSum="1">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageButton
            app:srcCompat="@drawable/ic_play_arrow_black_24px"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:id="@+id/btn_play_stop" />

        <ProgressBar
            android:padding="8dp"
            android:progress="0"
            android:id="@+id/progress_bar"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />

    </LinearLayout>

</LinearLayout>

Импортируйте аудио в androidstudio и воспроизводите его

Это пример того, как получить воспроизведение аудиофайла, который у вас уже есть на вашем ПК / ноутбуке. Сначала создайте новый каталог под res и назовите его как raw

этот

скопируйте аудио, которое вы хотите воспроизвести в эту папку. Возможно, это файл .mp3 или .wav.

Теперь, например, при нажатии кнопки вы хотите воспроизвести этот звук, вот как это делается

public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.aboutapp_activity);

    MediaPlayer song=MediaPlayer.create(this, R.raw.song);

    Button button=(Button)findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           song.start();
        }
    });
}
}

Это будет воспроизводить песню только один раз, когда нажимается кнопка, если вы хотите воспроизвести песню на каждой кнопке, нажмите код записи, подобный этому

 public class MainActivity extends AppCompatActivity {
 @Override
 public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.aboutapp_activity);

   MediaPlayer song=MediaPlayer.create(this, R.raw.song);

   Button button=(Button)findViewById(R.id.button);
   button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (song.isPlaying()) {
            song.reset();
            song= MediaPlayer.create(getApplicationContext(), R.raw.song);
       }
         song.start();
     }
   });
 }
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow