Android實(shí)現(xiàn)多媒體之播放音樂(lè)
閑來(lái)無(wú)聊,最近了解了一下多媒體的一些初步知識(shí)。
音頻播放主要設(shè)計(jì)到MediaPlayer這個(gè)類(lèi),播放音頻的路徑可以來(lái)源于三個(gè)地方。
1.應(yīng)用內(nèi)的音頻
public class MediaPlayActivity extends AppCompatActivity {
private SeekBar seekBar;
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_play);
seekBar = (SeekBar) findViewById(R.id.seekBar);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//獲取拖動(dòng)結(jié)束后的位置
int progress=seekBar.getProgress();
//跳轉(zhuǎn)到某個(gè)位置播放
mediaPlayer.seekTo(progress);
}
});
}
public void isPlayOrPause(View view){
ImageButton imageButton= (ImageButton) view;
if(mediaPlayer==null){//代表第一次播放音樂(lè)
mediaPlayer = MediaPlayer.create(this, R.raw.Loser);
mediaPlayer.start();
//把圖標(biāo)改成暫停的圖標(biāo)(這里的暫停圖標(biāo)就是播放時(shí)的狀態(tài))
imageButton.setImageResource(android.R.drawable.ic_media_pause);
//獲取音樂(lè)的總時(shí)長(zhǎng)
int duration=mediaPlayer.getDuration();
//設(shè)置進(jìn)度條的最大值為音樂(lè)的總時(shí)長(zhǎng)
seekBar.setMax(duration);
new MyThread();
}else if(mediaPlayer.isPlaying()){//正在播放音樂(lè)
mediaPlayer.pause();
//把圖標(biāo)改成播放的圖標(biāo)(暫停狀態(tài))
imageButton.setImageResource(android.R.drawable.ic_media_play);
}else{
mediaPlayer.start();
imageButton.setImageResource(android.R.drawable.ic_media_pause);
}
}
class MyThread extends Thread{
@Override
public void run() {
super.run();
while(seekBar.getProgress()<seekBar.getMax()){
//獲取當(dāng)前音樂(lè)播放的位置
int currentPosition=mediaPlayer.getCurrentPosition();
//讓進(jìn)度條跟著時(shí)間走
seekBar.setProgress(currentPosition);
}
}
}
}
2. 播放內(nèi)存卡里的音樂(lè),這一部分代碼就是替換前面的mediaPlayer = MediaPlayer.create(this, R.raw.Loser);
//播放內(nèi)存卡內(nèi)的音頻
mediaPlayer=new MediaPlayer();
//設(shè)置類(lèi)型
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//設(shè)置音源
try {
mediaPlayer.setDataSource(this, Uri.parse("file://mnt/sdcard/Music/f.mp3"));
//必須在播放前加載音頻文件
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
3.播放網(wǎng)絡(luò)上的音頻文件
首先我們要把網(wǎng)絡(luò)環(huán)境搭配,
1).找到我們tomcat放的位置,
2)然后雙擊startup.bat運(yùn)行,最小化界面
3)然后打開(kāi)cmd命令,輸入config找到我們本機(jī)的IPv4地址
4)然后在瀏覽器上試一下,是否能夠打開(kāi)tomcat的主頁(yè)
5)在把自己的mp3文件放到tomcat的ROOT目錄下
6)然后在自己的模擬器上,用瀏覽器同樣的去打開(kāi),用自己本機(jī)的IPv4地址去打開(kāi)tomcat的主頁(yè),在后面加上音樂(lè)的名字,看能不能放出來(lái),如果可以,就代表環(huán)境已經(jīng)搭配好了
7)接下來(lái)我們上代碼
把之前播放內(nèi)存卡上的音頻路徑改成網(wǎng)絡(luò)上的
//播放網(wǎng)絡(luò)上的
mediaPlayer.setDataSource(this, Uri.parse("http://192.168.43.164/internet.mp3"));
//必須在播放前加載音頻文件(異步準(zhǔn)備)
mediaPlayer.prepareAsync();
然后準(zhǔn)備完成的監(jiān)聽(tīng)
//監(jiān)聽(tīng):準(zhǔn)備完成的監(jiān)聽(tīng)
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
//把圖標(biāo)改成暫停的圖標(biāo)(這里的暫停圖標(biāo)就是播放時(shí)的狀態(tài))
imageButton.setImageResource(android.R.drawable.ic_media_pause);
//獲取音樂(lè)的總時(shí)長(zhǎng)
int duration=mediaPlayer.getDuration();
//設(shè)置進(jìn)度條的最大值為音樂(lè)的總時(shí)長(zhǎng)
seekBar.setMax(duration);
new MyThread();
}
});
最后,注意一個(gè)細(xì)節(jié),在Manifasit里面加上聯(lián)網(wǎng)的權(quán)限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
最后運(yùn)行一下,就大功告成了,界面非常的簡(jiǎn)單

如果你們想加上歌詞啊,時(shí)間啊,可以繼續(xù)完善,但是思路都差不多,今天的分享就到此了
- Android實(shí)現(xiàn)使用流媒體播放遠(yuǎn)程mp3文件的方法
- android多媒體音樂(lè)(MediaPlayer)播放器制作代碼
- Android多媒體之VideoView視頻播放器
- Android多媒體教程之播放視頻的四種方法
- Android 多媒體播放API簡(jiǎn)單實(shí)例
- Android開(kāi)發(fā)之MediaPlayer多媒體(音頻,視頻)播放工具類(lèi)
- Android開(kāi)發(fā)之多媒體文件獲取工具類(lèi)實(shí)例【音頻,視頻,圖片等】
- Android開(kāi)發(fā)實(shí)現(xiàn)的IntentUtil跳轉(zhuǎn)多功能工具類(lèi)【包含視頻、音頻、圖片、攝像頭等操作功能】
- Android開(kāi)發(fā)之媒體播放工具類(lèi)完整示例
相關(guān)文章
Android 監(jiān)聽(tīng)?wèi)?yīng)用前/后臺(tái)切換實(shí)例代碼
本篇文章主要介紹了Android 監(jiān)聽(tīng)?wèi)?yīng)用前/后臺(tái)切換實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
移動(dòng)端開(kāi)發(fā)之Jetpack?Hilt技術(shù)實(shí)現(xiàn)解耦
Hilt的出現(xiàn)解決前兩點(diǎn)問(wèn)題,因?yàn)镠ilt是Dagger針對(duì)Android平臺(tái)的場(chǎng)景化框架,比如Dagger需要我們手動(dòng)聲明注入的地方,而Android聲明的地方不都在onCreate()嗎,所以Hilt就幫我們做了,除此之外還做了很多事情2023-02-02
Android入門(mén)之Activity間互相傳值詳解
我們?cè)谥暗腟ervice篇章中看到了一種putExtras和getExtras來(lái)進(jìn)行activity與service間的傳值。而恰恰這種傳值其實(shí)也是Android里的通用傳值法。它同樣可以適用在activity與activity間傳值,本文就來(lái)和大家詳細(xì)講講2022-12-12
Android實(shí)現(xiàn)標(biāo)題顯示隱藏功能
這篇文章主要介紹了Android實(shí)現(xiàn)標(biāo)題顯示隱藏功能2016-02-02
Android View移動(dòng)的六種方法小結(jié)
在android開(kāi)發(fā)中,經(jīng)常會(huì)遇到一個(gè)view需要它能夠支持滑動(dòng)的需求。下面通過(guò)本篇文章給大家介紹android view移動(dòng)的六種方法,對(duì)android view移動(dòng)相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2015-12-12
Android 自定義SeekBar動(dòng)態(tài)改變硬件音量大小實(shí)現(xiàn)和音量鍵的同步(推薦)
這篇文章主要介紹了 Android 自定義SeekBar動(dòng)態(tài)改變硬件音量大小實(shí)現(xiàn)和音量鍵的同步效果,整段代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01
Android中區(qū)別Drawable Bitmap Canvas Paint
本文主要介紹Android中Drawable Bitmap Canvas Paint 之間的區(qū)別,這里對(duì)這幾個(gè)概念做出詳細(xì)介紹,開(kāi)發(fā)Android游戲的朋友可以參考下2016-07-07
Android后臺(tái)線程和UI線程通訊實(shí)例
這篇文章主要介紹了Android后臺(tái)線程和UI線程通訊實(shí)例,每一步的要點(diǎn)和步驟都有提及,并配有代碼例子,需要的朋友可以參考下2014-06-06

