Android. Пишем свой AudioPlayer

Давненько не было чего-то новенького, вот я и решил немного порадовать своих читателей новым екзамплом в виде AudioPlayer-а.

Вот что у меня получилось:

 

Предлагаю начать реализацию данного чудо приложения :)

Шаг 1.

Начинаем как всегда с визуального интерфейса.

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <SeekBar
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/seekBar"/>
    <Button
            android:text="@string/play_str"
            android:textSize="15pt"
            android:textStyle="bold"
            android:onClick="playAndStop"
            android:id="@+id/ButtonPlayStop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginRight="-3dp"/>

</LinearLayout>

Обратите внимание, что в нашей кнопке уже проставлен параметр android:onClick, который и будет проигрывать и останавливать музыку.

Шаг 2.

Дальше зайдем в папку res/values/strings.xml и добавим следующие строки:

<string name="play_str">PLAY</string>
<string name="pause_str">PAUSE</string>

Шаг 3.

Теперь нам нужно добавить в ресурсы ту песенку, которую вы хотите проигрывать.

Я люблю слушать группу Imagine Dragons, а именно Imagine Dragons – Radioactive, просто суперская песня.

Так вот, добавляем песенку в res/raw/imagine_dragons_radioactive.mp3.

У вас скорее всего не будет директории raw/, по этому вы смело можете её создать вручную в директории res/, и также обратите внимание на то как я переименовал песню imagine_dragons_radioactive.mp3. В её названии должны быть только маленькие буквы английского алфавита, а также допускаются символы подчеркивания и точка.

Шаг 4.

Перейдем непосредственно к коду, а точней к нашему Activity:

public class Player extends Activity {

    private Button buttonPlayStop;
    private MediaPlayer mediaPlayer;
    private SeekBar seekBar;

    private final Handler handler = new Handler();

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        initViews();

    }

...

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

В onCreate-е вызывается метод initViews():

private void initViews() {
     buttonPlayStop = (Button) findViewById(R.id.ButtonPlayStop);
     mediaPlayer = MediaPlayer.create(this, R.raw.imagine_dragons_radioactive);

     seekBar = (SeekBar) findViewById(R.id.seekBar);
     seekBar.setMax(mediaPlayer.getDuration());
     seekBar.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            seekChange(v);
            return false;
        }
     });
}

тут мы определяем кнопку и скролл, а также нашу песню с ресурсов в MediaPlayer.

Вешаем обработчик на перемотку песни.

Сам обработчик:

private void seekChange(View v){
    if(mediaPlayer.isPlaying()){
        SeekBar sb = (SeekBar)v;
        mediaPlayer.seekTo(sb.getProgress());
    }
}

И обработчик на Play и Stop :

public void playAndStop(View v){
    if (buttonPlayStop.getText() == getString(R.string.play_str)) {
        buttonPlayStop.setText(getString(R.string.pause_str));
        try{
            mediaPlayer.start();
            startPlayProgressUpdater();
        }catch (IllegalStateException e) {
            mediaPlayer.pause();
        }
    }else {
        buttonPlayStop.setText(getString(R.string.play_str));
        mediaPlayer.pause();
    }
}

И метод, который определяет проигрывать при нажатии кнопки Play или Stop музыку или же остановить.

public void startPlayProgressUpdater() {
    seekBar.setProgress(mediaPlayer.getCurrentPosition());

    if (mediaPlayer.isPlaying()) {
        Runnable notification = new Runnable() {
            public void run() {
                startPlayProgressUpdater();
            }
        };
        handler.postDelayed(notification,1000);
    }else{
        mediaPlayer.pause();
        buttonPlayStop.setText(getString(R.string.play_str));
        seekBar.setProgress(0);
    }
}

Шаг 5.

Не забываем проставить Activity в AndroidManifest.xml.

<application android:icon="@drawable/icon" android:label="@string/app_name">
     <activity android:name="Player"
               android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
     </activity>
</application>
Урок создан: 04 февраля 2013 | Просмотров: 24363 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 23 июня 2013 в 21:54

    Dast

    а как с Raw загрузить музыку а не инета с помощью setDataSource()?

  • 10 августа 2013 в 10:44

    pitrunea

    а как на счет проигрывания в фоне?

    • 18 сентября 2013 в 11:55

      Gelez

      используй сервисы

  • 22 ноября 2013 в 08:42

    Рома

    Добрый день!Почему исходник не импортируется в Eclips ?

  • 11 декабря 2013 в 05:18

    Рома

    Доброе утро! Помогите пожалуйста. Как в одну кнопку программировать пуск стоп пауза public void onClicktwo(View v) {
    MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.sound2);
    mediaPlayer.start();
    }

    }

    • 11 декабря 2013 в 10:02

      Александр Барчук

      Добрый день. самый простой способ — это создать boolean флаг который будет следить за состояниями и if -ом проверять что должна делать кнопка. Но так как тут три состояния, то лучше сделать int который будет равен 0 — стоп, 1 — плай, -1 — пауза

      • 11 декабря 2013 в 10:28

        Рома

        спасибо за ответ но я в этом деле навечок . Сможете код написать

        • 12 декабря 2013 в 12:31

          Рома

          доброе утро точно как у вас создал такую работал еще одну сик бар и кнопку добавил то что надо изменил теперь ошибка дупликат метод private void initViews1() что делать как исправить ?

  • 01 апреля 2014 в 10:54

    Айнур

    Добрый день)) А как сделать перелистывание песен? если я залью в папку рав несколько песен)

    • 16 января 2015 в 21:27

      name

      Большая проблема в андроид разработке, это описании методов не на русском(

  • 20 марта 2015 в 07:25

    Эмиль

    Здравствуйте, Александр,а в интеледж айдия могут испортироваться исходники?

  • 08 июня 2016 в 00:40

    Anonym

    Здравствуй, метод postDelayed в этой строке handler.postDelayed(notification,1000); подсвечивает красным и говорит Cannot resove method. ???? У меня полная копия вашего кода и такой сюрприз. Интересно даже ответите или нет, учитывая, что сайт не обновлялся аж с 14года

  • 22 июня 2016 в 10:31

    Влад

    Туториал учит использовать костыли, очень плохо.