Android实现在线播放音乐

下面介绍具体实现过程:

定义一个具有缓冲效果的播放器:Player

我们看到的缓冲效果,是通过设置拖动条SeekBar的二级进度实现的,这就要设置MediaPlayer的缓冲更新的监听了。

具体代码实现:

package com.wwj.download.util;

import java.io.IOException;

import java.util.Timer;

import java.util.TimerTask;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.media.MediaPlayer.OnBufferingUpdateListener;

import android.media.MediaPlayer.OnCompletionListener;

import android.media.MediaPlayer.OnPreparedListener;

import android.os.Handler;

import android.util.Log;

import android.widget.SeekBar;

public class Player implements OnBufferingUpdateListener, OnCompletionListener,

OnPreparedListener {

public MediaPlayer mediaPlayer; // 媒体播放器

private SeekBar seekBar; // 拖动条

private Timer mTimer = new Timer(); // 计时器

// 初始化播放器

public Player(SeekBar seekBar) {

super();

this.seekBar = seekBar;

try {

mediaPlayer = new MediaPlayer();

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);// 设置媒体流类型

mediaPlayer.setOnBufferingUpdateListener(this);

mediaPlayer.setOnPreparedListener(this);

} catch (Exception e) {

e.printStackTrace();

}

// 每一秒触发一次

mTimer.schedule(timerTask, 0, 1000);

}

// 计时器

TimerTask timerTask = new TimerTask() {

@Override

public void run() {

if (mediaPlayer == null)

return;

if (mediaPlayer.isPlaying() && seekBar.isPressed() == false) {

handler.sendEmptyMessage(0); // 发送消息

}

}

};

Handler handler = new Handler() {

public void handleMessage(android.os.Message msg) {

int position = mediaPlayer.getCurrentPosition();

int duration = mediaPlayer.getDuration();

if (duration > 0) {

// 计算进度(获取进度条最大刻度*当前音乐播放位置 / 当前音乐时长)

long pos = seekBar.getMax() * position / duration;

seekBar.setProgress((int) pos);

}

};

};

public void play() {

mediaPlayer.start();

}

/**

  • @param url

  •        url地址
    

*/

public void playUrl(String url) {

try {

mediaPlayer.reset();

mediaPlayer.setDataSource(url); // 设置数据源

mediaPlayer.prepare(); // prepare自动播放

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace();

} catch (IllegalStateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

// 暂停

public void pause() {

mediaPlayer.pause();

}

// 停止

public void stop() {

if (mediaPlayer != null) {

mediaPlayer.stop();

mediaPlayer.release();

mediaPlayer = null;

}

}

// 播放准备

@Override

public void onPrepared(MediaPlayer mp) {

mp.start();

Log.e(“mediaPlayer”, “onPrepared”);

}

// 播放完成

@Override

public void onCompletion(MediaPlayer mp) {

Log.e(“mediaPlayer”, “onCompletion”);

}

/**

  • 缓冲更新

*/

@Override

public void onBufferingUpdate(MediaPlayer mp, int percent) {

seekBar.setSecondaryProgress(percent);

int currentProgress = seekBar.getMax()

  • mediaPlayer.getCurrentPosition() / mediaPlayer.getDuration();

Log.e(currentProgress + “% play”, percent + " buffer");

}

}

package com.wwj.download;

import java.io.File;

import java.io.UnsupportedEncodingException;

import java.net.URLEncoder;

import android.app.Activity;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.os.Message;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ProgressBar;

import android.widget.SeekBar;

import android.widget.SeekBar.OnSeekBarChangeListener;

import android.widget.TextView;

import android.widget.Toast;

import com.wwj.download.util.Player;

import com.wwj.net.download.DownloadProgressListener;

import com.wwj.net.download.FileDownloader;

public class MainActivity extends Activity {

private static final int PROCESSING = 1;

private static final int FAILURE = -1;

private EditText pathText; // url地址

private TextView resultView;

private Button downloadButton;

private Button stopButton;

private ProgressBar progressBar;

private Button playBtn;

private Player player; // 播放器

private SeekBar musicProgress; // 音乐进度

private Handler handler = new UIHandler();

private final class UIHandler extends Handler {

public void handleMessage(Message msg) {

switch (msg.what) {

case PROCESSING: // 更新进度

progressBar.setProgress(msg.getData().getInt(“size”));

float num = (float) progressBar.getProgress()

/ (float) progressBar.getMax();

int result = (int) (num * 100); // 计算进度

resultView.setText(result + “%”);

if (progressBar.getProgress() == progressBar.getMax()) { // 下载完成

Toast.makeText(getApplicationContext(), R.string.success,

Toast.LENGTH_LONG).show();

}

break;

case FAILURE: // 下载失败

Toast.makeText(getApplicationContext(), R.string.error,

Toast.LENGTH_LONG).show();

break;

}

}

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

pathText = (EditText) findViewById(R.id.path);

resultView = (TextView) findViewById(R.id.resultView);

downloadButton = (Button) findViewById(R.id.downloadbutton);

stopButton = (Button) findViewById(R.id.stopbutton);

progressBar = (ProgressBar) findViewById(R.id.progressBar);

ButtonClickListener listener = new ButtonClickListener();

downloadButton.setOnClickListener(listener);

stopButton.setOnClickListener(listener);

playBtn = (Button) findViewById(R.id.btn_online_play);

playBtn.setOnClickListener(listener);

musicProgress = (SeekBar) findViewById(R.id.music_progress);

player = new Player(musicProgress);

musicProgress.setOnSeekBarChangeListener(new SeekBarChangeEvent());

}

private final class ButtonClickListener implements View.OnClickListener {

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.downloadbutton: // 开始下载

// http://abv.cn/music/光辉岁月.mp3,可以换成其他文件下载的链接

String path = pathText.getText().toString();

String filename = path.substring(path.lastIndexOf(‘/’) + 1);

try {

// URL编码(这里是为了将中文进行URL编码)

filename = URLEncoder.encode(filename, “UTF-8”);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

path = path.substring(0, path.lastIndexOf(“/”) + 1) + filename;

if (Environment.getExternalStorageState().equals(

Environment.MEDIA_MOUNTED)) {

// File savDir =

// Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);

// 保存路径

File savDir = Environment.getExternalStorageDirectory();

download(path, savDir);

} else {

Toast.makeText(getApplicationContext(),

R.string.sdcarderror, Toast.LENGTH_LONG).show();

}

downloadButton.setEnabled(false);

stopButton.setEnabled(true);

break;

case R.id.stopbutton: // 暂停下载

exit();

Toast.makeText(getApplicationContext(),

“Now thread is Stopping!!”, Toast.LENGTH_LONG).show();

downloadButton.setEnabled(true);

stopButton.setEnabled(false);

break;

case R.id.btn_online_play:

new Thread(new Runnable() {

@Override

public void run() {

player.playUrl(pathText.getText().toString());

}

}).start();

break;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-D8LFZVRv-1715047299753)]

[外链图片转存中…(img-SkrXdCCj-1715047299753)]

[外链图片转存中…(img-oaQ2M9W8-1715047299753)]

[外链图片转存中…(img-HcQxRbdy-1715047299753)]

[外链图片转存中…(img-LM4QIYrD-1715047299754)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android 可以通过以下几个步骤来实现播放音乐: 1. 创建一个 MediaPlayer 对象,该对象将用于播放音乐。可以使用 MediaPlayer 类提供的静态方法 create() 来创建一个新的 MediaPlayer 对象。 2. 为 MediaPlayer 对象设置数据源。可以使用 setDataSource() 方法设置要播放的音乐文件的路径或 URI。 3. 准备 MediaPlayer 对象。可以使用 prepare() 或 prepareAsync() 方法准备 MediaPlayer 对象。如果使用 prepareAsync() 方法,则需要注册一个 OnPreparedListener 来在 MediaPlayer 准备完成后接收通知。 4. 开始播放音乐。可以使用 start() 方法开始播放音乐。 5. 可以使用 pause() 方法暂停播放音乐,并使用 seekTo() 方法跳到特定的播放位置。 6. 播放完成后,可以使用 setOnCompletionListener() 方法注册一个 OnCompletionListener,以便在播放完成时接收通知。 7. 最后,可以在 Activity 或 Fragment 的 onDestroy() 方法中释放 MediaPlayer 对象,并将其设置为 null。 以上就是在 Android实现播放音乐的基本步骤。 ### 回答2: 在Android系统中,要实现音乐播放功能可以利用MediaPlayer类进行操作。首先需要准备音频文件,可以将音频文件放在res/raw目录下或者指定一个网络链接。接下来,在需要播放音乐的地方创建一个MediaPlayer对象,然后调用该对象的setDataSource方法设置音频源。 例如,如果音频文件放在res/raw目录下,可以使用如下代码进行设置: `MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.music);` 若需要指定一个网络链接的音频文件,可以使用如下代码进行设置: `MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource("http://example.com/music.mp3");` 然后,需要调用prepare或者prepareAsync方法进行准备。如果不需要实时播放,可以直接调用prepare方法;如果需要实时播放,可以调用prepareAsync方法并在OnPreparedListener中监听准备完成的事件。 例如,使用prepare方法进行准备: `mediaPlayer.prepare();` 需要注意的是,在prepareAsync方法中需要实现OnPreparedListener接口,并在onPrepared方法中开始播放音乐。 最后,可以通过调用start方法来开始播放音乐。 例如: `mediaPlayer.start();` 如果需要暂停音乐可以使用pause方法,停止音乐可以使用stop方法,释放资源可以使用release方法。 例如: `mediaPlayer.pause(); mediaPlayer.stop(); mediaPlayer.release();` 以上就是在Android实现音乐播放的简单步骤。当然,还可以使用其他音频播放框架如ExoPlayer等来实现更复杂的音乐播放功能。 ### 回答3: Android实现播放音乐的方法有多种,以下是其中一种常见的实现方式: 首先,需要准备音乐文件。将音乐文件放置在res目录下的raw文件夹中,或者从网络上获取音乐文件的URL。 其次,创建一个MediaPlayer对象来管理音频播放。在Activity或Fragment中初始化MediaPlayer对象,并设置音频文件的路径或URL。 接下来,可以使用MediaPlayer对象的一些方法来控制音频播放。比如,使用prepareAsync()方法进行准备操作,使用start()方法开始播放音频,使用pause()方法暂停音频播放,使用stop()方法停止音频播放等。 还可以通过设置监听器来监听音频播放的状态。可以设置OnPreparedListener监听器在音频准备完成时进行播放,设置OnCompletionListener监听器在音频播放完成时执行一些操作,设置OnErrorListener监听器在发生错误时处理异常等。 此外,还可以添加一些额外的功能。比如,可以使用SeekBar控件来显示和调整音频的进度,使用AudioManager来控制音频的音量,使用Notification来显示音频播放状态等。 最后,在Activity或Fragment的生命周期方法中释放MediaPlayer对象,以确保资源被正确释放。 总的来说,Android实现播放音乐可以通过准备音频文件,创建MediaPlayer对象,使用MediaPlayer的方法控制音频播放,设置监听器监听播放状态,添加其他功能等步骤来完成。使用这些方法可以实现一个简单的音乐播放器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值