Naučte sa vyvíjať Android aplikácie – prehrávanie zvuku a videa

1

Na podporu práce s multimédiami sú na platforme Android pre vývojárov aplikácií k dispozícii triedy AudioManager, - trieda umožňuje aplikáciám prehrávať zvukové efekty a zvukové súbory, či ovládať hardvérové ​​zariadenia súvisiace s prehrávaním zvuku, napríklad reproduktory a bezdrôtové slúchadlá. Aplikácie získa referenciu na triedu AudioManager volaním metódy 

getSystemService(Context.AUDIO_SERVICE). Následne je možné načítať zvukové súbory a ovládať hardvérové zariadenia.

SoundPool  - trieda obsahuje kolekciu zvukových vzoriek alebo streamov. SoundPool  umožňuje miešať a hrať viac vzoriek súčasne. 

RingtoneManager, Ringtone – na ovládanie zvukov vyzváňania a alarmov

MediaPlayer – trieda umožňuje aplikáciám prehrávať audio a video súbory. Z triedy MediaPlayer budete najčastejšie využívať metódy

  • setDataSource() - pomocou tejto metódy oznámite triede MediaPlayer, aké streamy sa budú prehrávať.
  • prepare() - v metóde sa inicializuje MediaPlayer a načítajú sa potrebné multimediálne streamy. Metóda je synchrónna, čo znamená, že ju budete používať vtedy, ak mediálny obsah je uložený v súbore na zariadení. K dispozícii je aj asynchrónna verzia tejto metódy, ktorú použijete, ak je mediálny obsah streamovaný z internetu.
  • start() –umožní spustiť prehrávanie, alebo pokračovať v pozastavenom prehrávaní
  • pause() – umožní pozastaviť prehrávanie
  • seekTo() - metóda umožňuje prejsť na konkrétnu pozíciu v streame
  • stop() – zastaví prehrávanie
  • release()- uvoľňuje aktuálne používané prostriedky na prehrávanie multimediálneho obsahu

MediaRecorder- umožňuje aplikáciám záznam zvuku a obrazu

Camera - umožňuje aplikáciám ovládanie hardvéru na snímanie  fotografií  

Príklad – prehrávanie zvuku

Zadanie príkladu je komplet v jeho názve. Vytvorte projekt Android aplikácie, ktorá bude prehrávať súbor z krátkym zvukovým efektom, napríklad sirénou vo formáte. Súbor získate z internetu. V zložke res vytvorte vnorenú zložku raw a do nej prekopírujte zvukový súbor. 

V layoute hlavnej aktivity bude tlačidlo na prehranie zvukového efektu a dva tlačidlá na ovládanie hlasitosti. Úroveň hlasitosti v škále od 0 do 10 taktiež zobrazíme na displeji.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">
 
    <Button
        android:id="@+id/play"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dip"
        android:enabled="false"
        android:text="Play" >
    </Button>
 
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="10dip"
        android:textSize="32sp" >
    </TextView>
 
    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="25dp" >
 
        <Button
            android:id="@+id/down"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="-" >
        </Button>
 
        <Button
            android:id="@+id/up"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="+" >
        </Button>
    </LinearLayout>
</LinearLayout>

V kóde hlavnej aktivity, v metóde OnCreate získa aplikácia odkaz na triedu AudioManager a nastaví implicitnú hodnotu hlasitosti.

Po získaní referencie na tlačidlo Play sa toto tlačidlo zakáže dovtedy, kým sa nevytvorí trieda SoundPool a nenaplní sa obsahom, teda zvukom zo súboru. Po naplnení bude SoundPool obsahovať jeden audiostream. Ak by sa to nepodarilo, nebolo by čo prehrávať. Tlačidlo Play povolíme po nahraní zvuku v metóde setOnLoadCompleteListener. Pre jednoduchosť zvukový súbor načítame v hlavnom vlákne, nakoľko súbor je krátky a je súčasťou aplikácie. Netreba ho nahrávať z internetu ani z pamäťovej karty. 

Aplikácia môže prehrávať zvuk až potom, keď získa fokus na príslušný hardvér. 

int result = audioManager.requestAudioFocus(afChangeListener,

               AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

V aplikácii na prehrávanie zvuku by sa patrilo pomocou zvukového efektu signalizovať aj ťuknutie na tlačidlá regulácie hlasitosti. Preto prehráme zvuk

audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);

Kompletný kód hlavnej aktivity

package com.example.prehravaniezvuku;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity {
    private int hlasitost = 5, max = 10, min = 0;
    private SoundPool soundPool;
    private int id;
    private AudioManager audioManager;
    private boolean bPlay;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView tv = (TextView) findViewById(R.id.textView1);
        tv.setText(String.valueOf(hlasitost));
 
        audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
 
        final Button upButton = (Button) findViewById(R.id.up);
        upButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
                if (hlasitost < max) {
                    hlasitost ++;
                    tv.setText(String.valueOf(hlasitost));
                }
            }
        });
 
        final Button downButton = (Button) findViewById(R.id.down);
        downButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
                if (hlasitost > min) {
                    hlasitost --;
                    tv.setText(String.valueOf(hlasitost));
                }
            }
        });
 
        final Button playButton = (Button) findViewById(R.id.play);
        playButton.setEnabled(false);
 
        soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
        id = soundPool.load(this, R.raw.zvuk, 1);
 
        soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener()
        {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId,
                                       int status)
            {
                if (status ==0 ) playButton.setEnabled(true);
            }
        });
 
        playButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (bPlay)
                    soundPool.play(id, (float) hlasitost / max,
                            (float) hlasitost / max, 1, 0, 1.0f);
            }
 
        });
 
        int result = audioManager.requestAudioFocus(afChangeListener,
                AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
 
        bPlay = AudioManager.AUDIOFOCUS_REQUEST_GRANTED == result;
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        audioManager.setSpeakerphoneOn(true);
        audioManager.loadSoundEffects();
    }
 
    @Override
    protected void onPause()  {
        if (soundPool != null)  {
            soundPool.unload(id);
            soundPool.release();
            soundPool = null;
        }
        audioManager.setSpeakerphoneOn(false);
        audioManager.unloadSoundEffects();
        super.onPause();
    }
 
 
    AudioManager.OnAudioFocusChangeListener afChangeListener = new AudioManager.OnAudioFocusChangeListener()
    {
        public void onAudioFocusChange(int focusChange)
        {
            if (focusChange == AudioManager.AUDIOFOCUS_LOSS)   {
                audioManager.abandonAudioFocus(afChangeListener);
                bPlay = false;
            }
        }
    };
}

 

Príklad – prehrávanie videa

Na zobrazovanie videa sa využíva trieda VideoView odvodená od triedy SurfaceView, ktorá vnútorne využíva MediaPlayer. Trieda VideoView dokáže načítať video obsah z rôznych zdrojov a riadiť jeho prehrávanie. V aplikácii zobrazíme okno na prehrávanie videa a integrované ovládacie prvky na riadenie prehrávania. 

Vytvorte projekt Android aplikácie, ktorá bude prehrávať krátke video. Súbor získate z internetu, alebo z príkladov ktoré sú súčasťou Android SDK. V zložke res vytvorte vnorenú zložku raw a do nej prekopírujte súbor s videom. Nakoľko video bude súčasťou aplikácie, vyberajte krátke video, aby veľkosť súboru nepresiahla niekoľko megabajtov.

V layoute hlavnej aktivity bude iba prvok VideoView na prehrávanie videa.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
 
    <VideoView
        android:id="@+id/prehravac"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" />
</RelativeLayout>

V metóde OnCreate aplikácia získa odkaz na prvok VideoView. Následne vytvára inštanciu triedy MediaController, ktorý obsahuje ovládacie prvky pre ovládanie prehrávača. 

V projektoch tohto typu môžete využiť metódy triedy VideoView

  • setVideoPath(String path) – cesta k video súboru. Môže to byť URL adresa videa na webe, alebo cesta k lokálnemu súboru. 
  • setVideoUri(Uri uri) – adresa videa na webe ako URI objekt
  • start() – spusti prehrávanie.
  • stopPlayback() – zastav prehrávanie.
  • pause() – preruš prehrávanie.
  • isPlaying() – vráti Boolean hodnotu, či sa video práve prehráva.
  • setMediaController(MediaController) – Vytvorí inštanciu objektu MediaController na zobrazenie ovládacích prvkov prehrávania.
  • setOnCompletionListener(MediaPlayer.OnCompletionListener) - callback metóda, volá sa keď je prehrávanie videa na konci.
  • setOnErrorListener(MediaPlayer.OnErrorListener) – callback metóda, volá sa, ak pri prehrávaní videa dôjde k chybe.
  • setOnPreparedListener(MediaPlayer.OnPreparedListener) – callback metóda, volá sa keď je video pripravené na prehrávanie.
  • getDuration() – čas trvania videa. Hodnotu -1 vráti kým sa neaktivuje callback OnPreparedListener() 
  • getCurrentPosition() – pozícia prehrávania (integer).

Video sa nahráva cez URI,  ktorý odkazuje na súbor uložený v zložke res/raw.

Metóda OnPreparedListener sa bude volať, akonáhle je súbor s videom načítaný a pripravený na prehrávanie. 

Kompletný kód hlavnej aktivity

package com.example.prehravanievidea;
 
        import androidx.appcompat.app.AppCompatActivity;
        import android.net.Uri;
        import android.os.Bundle;
        import android.widget.MediaController;
        import android.widget.VideoView;
 
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        VideoView videoView =(VideoView)findViewById(R.id.prehravac);
        MediaController mediaController= new MediaController(this);
        mediaController.setAnchorView(videoView);
         Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.video);
        videoView.setMediaController(mediaController);
        videoView.setVideoURI(uri);
        videoView.requestFocus();
        videoView.start();
    }
}

Ak prehrávate video z internetu, nezabudnite túto skutočnosť deklarovať v aplikačnom manifeste

<uses-permission android:name="android.permission.INTERNET" />

Rekapitulácia seriálu

1  – Prvá aplikácia 

2 – Možnosti emulátorov 

3 - Zorientujte sa v projekte aplikácie

4 – Princípy dizajnu a škálovania

5 – Uporiadanie prvkov používateľského rozhrania

6 – Obsluha udalostí

7 – Aplikácia s dvomi aktivitami  

8 – Spustenie na reálnom zariadení

9 – Intenty, alebo kto to urobí

10 – Dotyky a gestá

11 - Dotyky a gestá II  

12  - Zmena orientácie displeja

13 – Grafika 1

14 – Grafika II

15 - Animácia

16 – Animácia II

Zobrazit Galériu

Luboslav Lacko

Všetky autorove články
Vývoj Android Android aplikácie Android Studio

1 komentár

seriál reakcia na: Naučte sa vyvíjať Android aplikácie – prehrávanie zvuku a videa

23.5.2020 16:05
Zdravím,
budú ešte nejaké ďalšie diely seriálu? Koľko častí plánujete celkovo? Bude niečo aj o komunikácii zariadení cez BT a WiFi? Práca s kamerou?
Reagovať

Pridať komentár

Mohlo by vás zaujímať

Mohlo by vás zaujímať