Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用
来源:互联网 发布:怎么做淘宝客挣钱 编辑:程序博客网 时间:2024/04/29 11:18
1. SoundPool 用于快速重复的播放短音频
public class MainActivity extends Activity {private SoundPool soundPool;private int soundId;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);// 把声音资源预先加载到声音池, load为异步方法//声音资源放到 res/raw目录下, raw名字须固定soundId = soundPool.load(this, R.raw.ring, 1);}public void click(View view) {soundPool.play(soundId, 1.0f, 1.0f, 0, 0, 1.0f);}}
2. 视频播放示例代码 (播放暂停,进度条拖放等功能)
输入的路径不仅可以是本地的视频路径,也可以是一个网络视频路径,播放器会自动在线播放,不过需要添加 Internet权限。
activity_main.xml 布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <EditText android:text="/sdcard/oppo.mp4" android:id="@+id/et_path" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入视频文件的路径" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/bt_play" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:text="播放" /> <Button android:id="@+id/bt_pause" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:text="暂停" /> <Button android:id="@+id/bt_replay" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:text="重播" /> <Button android:id="@+id/bt_stop" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:text="停止" /> </LinearLayout> <SeekBar android:id="@+id/seek_bar" android:layout_width="match_parent" android:layout_height="wrap_content" /> <SurfaceView android:id="@+id/sv" android:layout_width="fill_parent" android:layout_height="fill_parent" /></LinearLayout>
MainActivity.java
import java.io.File;import java.io.IOException;import java.util.Timer;import java.util.TimerTask;import android.media.AudioManager;import android.media.MediaPlayer;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.SeekBar;import android.widget.SeekBar.OnSeekBarChangeListener;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private Button bt_play;private Button bt_replay;private Button bt_stop;private Button bt_pause;private EditText et_path;private SurfaceView sv;private MediaPlayer mediaPlayer;private int position;private SeekBar seek_bar;private Timer timer;private TimerTask task;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bt_play = (Button) findViewById(R.id.bt_play);bt_replay = (Button) findViewById(R.id.bt_replay);bt_stop = (Button) findViewById(R.id.bt_stop);bt_pause = (Button) findViewById(R.id.bt_pause);sv = (SurfaceView) findViewById(R.id.sv);seek_bar = (SeekBar) findViewById(R.id.seek_bar);seek_bar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {if(mediaPlayer!=null){mediaPlayer.seekTo(seekBar.getProgress());}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {}});/* 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */sv.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);sv.getHolder().addCallback(new Callback() {@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {System.out.println("holder 被销毁了.");if (mediaPlayer != null && mediaPlayer.isPlaying()) {position = mediaPlayer.getCurrentPosition();stop();}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {System.out.println("holder 被创建了.");if (position != 0) {play();mediaPlayer.seekTo(position);}}// 主要是当holder的大小发生变化的时候 调用@Overridepublic void surfaceChanged(SurfaceHolder holder, int format,int width, int height) {}});bt_play.setOnClickListener(this);bt_replay.setOnClickListener(this);bt_stop.setOnClickListener(this);bt_pause.setOnClickListener(this);et_path = (EditText) findViewById(R.id.et_path);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.bt_play:play();break;case R.id.bt_replay:replay();break;case R.id.bt_stop:stop();break;case R.id.bt_pause:pause();break;}}/** * 重新播放 */private void replay() {if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.seekTo(0);} else {play();}}/** * 停止播放 */private void stop() {if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;bt_play.setEnabled(true);if (timer != null && task != null) {timer.cancel();task.cancel();timer = null;task = null;}}}/** * 暂停播放 */private void pause() {if (mediaPlayer != null && mediaPlayer.isPlaying()) {// 暂停播放mediaPlayer.pause();bt_pause.setText("继续");return;}if (mediaPlayer != null) {if ("继续".equals(bt_pause.getText().toString())) {mediaPlayer.start();bt_pause.setText("暂停");return;}}}/** * 播放 */private void play() {String path = et_path.getText().toString().trim();File file = new File(path);//添加判断条件,如果路径带http 网路视频在线播放if ( (file.exists() && file.length() > 0) || path.contains("http")) {try {mediaPlayer = new MediaPlayer();mediaPlayer.reset();// 重置为初始状态mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);/* 设置Video影片以SurfaceHolder播放 */mediaPlayer.setDisplay(sv.getHolder());mediaPlayer.setDataSource(path);//prepare同步准备//prepareAsync为异步准备,不会阻塞主线程,需要注册OnPrepareListener, 并在其中执行start()mediaPlayer.prepare();mediaPlayer.start();// 播放int max = mediaPlayer.getDuration();seek_bar.setMax(max);// 创建一个定时器timer = new Timer();// 创建一个定时器执行的任务task = new TimerTask() {@Overridepublic void run() {int position = mediaPlayer.getCurrentPosition();seek_bar.setProgress(position);}};timer.schedule(task, 0, 1000);} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "播放失败", 1).show();}}}}
3. 音频播放示例:类似于视频播放
MainActivity.java
import java.io.File;import java.io.IOException;import android.app.Activity;import android.media.AudioManager;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.media.MediaPlayer.OnErrorListener;import android.media.MediaPlayer.OnPreparedListener;import android.os.Bundle;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private Button bt_play;private Button bt_replay;private Button bt_stop;private Button bt_pause;private EditText et_path;private MediaPlayer mediaPlayer;private TelephonyManager tm;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bt_play = (Button) findViewById(R.id.bt_play);bt_replay = (Button) findViewById(R.id.bt_replay);bt_stop = (Button) findViewById(R.id.bt_stop);bt_pause = (Button) findViewById(R.id.bt_pause);bt_play.setOnClickListener(this);bt_replay.setOnClickListener(this);bt_stop.setOnClickListener(this);bt_pause.setOnClickListener(this);et_path = (EditText) findViewById(R.id.et_path);tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);}private class MyListener extends PhoneStateListener{@Overridepublic void onCallStateChanged(int state, String incomingNumber) {switch (state) {case TelephonyManager.CALL_STATE_RINGING:pause();break;case TelephonyManager.CALL_STATE_IDLE:pause();break;}super.onCallStateChanged(state, incomingNumber);}}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.bt_play:play();break;case R.id.bt_replay:replay();break;case R.id.bt_stop:stop();break;case R.id.bt_pause:pause();break;}}/** * 重新播放 */private void replay() {if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.seekTo(0);}else{play();}}/** * 停止播放 */private void stop() {if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;bt_play.setEnabled(true);}}/** * 暂停播放 */private void pause() {if (mediaPlayer != null && mediaPlayer.isPlaying()) {// 暂停播放mediaPlayer.pause();bt_pause.setText("继续");return;}if (mediaPlayer != null) {if ("继续".equals(bt_pause.getText().toString())) {mediaPlayer.start();bt_pause.setText("暂停");return;}}}/** * 处理播放 */private void play() {String path = et_path.getText().toString().trim();File file = new File(path);if (file.exists() && file.length() > 0) {try {mediaPlayer = new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.setDataSource(path);//mediaPlayer.setLooping(looping);//播放完毕后的 事件监听器mediaPlayer.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {bt_play.setEnabled(true);}});mediaPlayer.setOnErrorListener(new OnErrorListener() {@Overridepublic boolean onError(MediaPlayer mp, int what, int extra) {bt_play.setEnabled(true);Toast.makeText(MainActivity.this, "音乐文件错误", 0).show();return false;}});//mediaPlayer.prepare();//同步准备.mediaPlayer.prepareAsync();//异步准备 在一个新的子线程里面准备//通知用户缓存中...mediaPlayer.setOnPreparedListener(new OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {//通知用户开始播放...mediaPlayer.start();}});bt_play.setEnabled(false);} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "播放音乐失败", 0).show();}} else {Toast.makeText(this, "音乐文件不存在", 0).show();}}}
0 0
- Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用
- Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用
- Android多媒体---SurfaceView(播放视频)+Mediaplayer(音频)
- Android Mediaplayer 播放视频/音频 SoundPool
- Android 多媒体应用——MediaPlayer与SurfaceView播放视频
- Android:使用MediaPlayer和SurfaceView播放视频
- Android 使用 MediaPlayer + SurfaceView 播放视频
- 【Android开发】多媒体应用开发-使用SoundPool播放音频
- Android音频播放(SoundPool与 MediaPlayer)
- Android --- 多媒体应用(SoundPool播放音频)
- android视频播放MediaPlayer+SurfaceView
- 使用SurfaceView&MediaPlayer播放视频
- 使用SurfaceView+MediaPlayer视频播放
- 【Android开发】多媒体应用开发-使用MediaPlayer播放音频
- Android里面使用MediaPlayer通过SurfaceView播放视频的示例
- Android之多媒体--使用MediaPlayer和SurfaceView播放视频
- Android 使用MediaPlayer与SurfaceView进行视频播放
- Android中使用MediaPlayer类和SurfaceView播放视频
- Java通过反射创建对象
- 【综合】设计移动App的十大技巧
- 网络开发(详)
- hive出bug:Caused by: java.io.FileNotFoundException: /tmp/root/hive-20140408.。。。。
- Linux 安装与配置tomcat 8
- Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用
- Tomcat6虚拟路径的配置
- ubuntu下SSH安装出现的错误及解决方法
- 各种排序算法及其java程序实现
- IOS开发之----常用加密方法(AES、MD5、Base64)
- 2013级C++第7周(春)项目——深复制、友元、模板 【项目3-成员函数、友元函数和一般函数有区别】
- C语言每日小练(一)——7744问题
- 2525
- Data Guard Gap Detection and Resolution (Doc ID 232649.1)