Android
Медиа-плейер
Поиск…
Синтаксис
- 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 может быть трех типов:
Средства массовой информации из местных ресурсов
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.resource); mediaPlayer.start(); // no need to call prepare(); create() does that for you
Из локального URI (полученного от ContentResolver)
Uri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
Из внешнего 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();
}
});
}
}