Zoeken…


Syntaxis

  • void setAudioStreamType (int streamtype)
  • void setDataSource (Context context, Uri uri)
  • void prepare ()
  • void prepareAsync ()
  • ongeldige start ()
  • ongeldige stop ()

Opmerkingen

Het gebruik van MediaPlayer is voornamelijk gebaseerd op het statusdiagram:

voer hier de afbeeldingsbeschrijving in

Dat betekent dat om een audio / video af te spelen een specifieke volgorde van actie moet plaatsvinden. Het geeft ook aan welke acties in welke staat kunnen worden uitgevoerd .

De MediaPlayer API mist flexibiliteit (toevoeging van aangepaste decoder en renderinglogica) en mist sSupport voor Dynamic Adaptive Streaming via HTTP (DASH) en SmoothStreaming. Kijk hiervoor in ExoPlayer .

Basis creatie en spelen

De klasse MediaPlayer kan worden gebruikt om het afspelen van audio- / videobestanden en streams te regelen.

Het maken van het MediaPlayer-object kan drie soorten zijn:

  1. Media van lokale bronnen

    MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.resource);
    mediaPlayer.start(); // no need to call prepare(); create() does that for you
    
  2. Van lokale URI (verkregen van ContentResolver)

    Uri myUri = ....; // initialize Uri here
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setDataSource(getApplicationContext(), myUri);
    mediaPlayer.prepare();
    mediaPlayer.start();
    
  3. Van externe 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();
    

Asynchroon voorbereiden

De MediaPlayer$prepare() is een blokkerende oproep en bevriest de gebruikersinterface totdat de uitvoering is voltooid. Om dit probleem op te lossen, kan MediaPlayer$prepareAsync() worden gebruikt.

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

Bij synchrone bewerkingen worden fouten normaal gesproken met een uitzondering of een foutcode gemeld, maar wanneer u asynchrone bronnen gebruikt, moet u ervoor zorgen dat uw toepassing op de juiste wijze op de hoogte wordt gesteld. Voor 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
        }
});

Systeembeltonen krijgen

Dit voorbeeld laat zien hoe u de URI's van systeembeltonen kunt ophalen ( 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;
    }

De lijst is afhankelijk van het type gevraagde beltonen. De mogelijkheden zijn:

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


Om de Ringtones als android.media.Ringtone te krijgen, moet elke Uri door de RingtoneManager worden opgelost:

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

Gebruik de methode om het geluid af te spelen:

public void setDataSource(Context context, Uri uri)

van android.media.MediaPlayer . MediaPlayer moet worden geïnitialiseerd en voorbereid volgens het statusdiagram

Systeemvolume ophalen en instellen

Typen audiostreams

Er zijn verschillende profielen voor beltoonstreams. Elk van hen heeft zijn eigen volume.

Elk voorbeeld hier is geschreven voor AudioManager.STREAM_RING . Dit is echter niet de enige. De beschikbare streamsoorten zijn:

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


Volume instellen

Bel voor het volume van een specifiek profiel:

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

Deze waarde is erg weinig nuttig, wanneer de maximale waarde voor de stream niet bekend is:

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

De verhouding tussen die twee waarden geeft een relatief volume (0 <volume <1):

float volume = ((float) currentVolume) / streamMaxVolume


Volume aanpassen met één stap

Als u het volume voor de stream één stap hoger wilt zetten, belt u:

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

Als u het volume voor de stream één stap lager wilt zetten, belt u:

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


MediaPlayer instellen om een specifiek streamtype te gebruiken

Er is een helpfunctie van de MediaPlayer klasse om dit te doen.
Bel gewoon void setAudioStreamType(int streamtype) :

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

Mediaspeler met buffervoortgang en afspeelpositie

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>

Importeer audio in androidstudio en speel het

Dit is een voorbeeld om een audiobestand af te spelen dat je al op je pc / laptop hebt. Maak eerst een nieuwe map onder res en noem deze zo rauw als deze

deze

kopieer de audio die u wilt afspelen naar deze map. Het kan een .mp3- of .wav-bestand zijn.

Nu wilt u bijvoorbeeld bij het klikken op een knop dit geluid afspelen, hier is hoe het is gedaan

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();
        }
    });
}
}

Hiermee wordt het nummer slechts eenmaal afgespeeld wanneer op de knop wordt geklikt. Als u het nummer op elke knop opnieuw wilt afspelen, klikt u op code schrijven zoals deze

 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow