android 缓存网络音频播放

package com.smartbabybottles_kaiser.helper;


import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Timer;
import java.util.TimerTask;


import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;
import android.widget.SeekBar;


import com.ui.smartbabybottles.R;


public class MyPlayMusicHelper implements OnBufferingUpdateListener,
OnCompletionListener, MediaPlayer.OnPreparedListener {


public MediaPlayer mediaPlayer;
private SeekBar skbProgress;
private long videoTotalSize = 0;
private long videoCacheSize = 0;
private AudioManager audioManager;
private String localUrl;
private Context context;
private boolean isplay = true;
private String mp3String = "a";
private ImageView imageView;
private boolean istrue;// 用于判断是否是同一个item的录音,作用完成改变按钮图片状态
private boolean isfirst = true;
private Timer mTimer = new Timer();


public MyPlayMusicHelper(Context context) {
// this.skbProgress = skbProgress;
this.context = context;
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnPreparedListener(this);
} catch (Exception e) {
Log.e("mediaPlayer", "error", e);
}


// mTimer.schedule(mTimerTask, 0, 1000);
}


//
/*******************************************************
* 通过定时器和Handler来更新进度条
******************************************************/
TimerTask mTimerTask = new TimerTask() {
@Override
public void run() {
if (mediaPlayer == null)
return;
if (mediaPlayer.isPlaying() && skbProgress.isPressed() == false) {
handleProgress.sendEmptyMessage(0);
}
}
};


Handler handleProgress = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
// int position = mediaPlayer.getCurrentPosition();
// int duration = mediaPlayer.getDuration();
//
// if (duration > 0) {
// long pos = skbProgress.getMax() * position / duration;
// skbProgress.setProgress((int) pos);
// }


break;
case 1:
// 下载完成之后播放
try {
playMusicBySDCar(localUrl);
// if (mediaPlayer != null) {
// if (mediaPlayer.isPlaying()) {
// mediaPlayer.pause();
// } else {
// mediaPlayer.start();
// }
// }
} catch (Exception e) {
e.printStackTrace();
}
break;
default:
break;
}
};
};


// *****************************************************


public void play() {
mediaPlayer.start();
}


public void playUrl(final String videoUrl, ImageView imageView) {
try {
this.imageView = imageView;
// // 先判断是否是同一个MP3
if (!mp3String.equals(videoUrl)) {
istrue = false;
if (isplay) {
isplay = false;// 第一次进入不销毁mediaPlayer
} else {
destroyMediaPlayer();
}
} else {
istrue = true;
}
new Thread(new Runnable() {


@Override
public void run() {
try {
// if (isplay) {
// isplay = false;
// }


mp3String = videoUrl;
prepareVideo(videoUrl);


} catch (IOException e) {
e.printStackTrace();
}


}
}).start();
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
} else {
mediaPlayer.start();
}
}
// mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}


public MediaPlayer getMyMediaPlayer() {
if (mediaPlayer != null) {
return mediaPlayer;
}
return null;
}


public void pause() {
mediaPlayer.pause();
}


public void stop() {
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
}


private void destroyMediaPlayer() {
if (mediaPlayer != null) {
mediaPlayer.setDisplay(null);
mediaPlayer.reset();
// mediaPlayer.release();
// mediaPlayer = null;
}
}


@Override
/**  
* 通过onPrepared播放  
*/
public void onPrepared(MediaPlayer arg0) {
arg0.start();
Log.e("mediaPlayer", "onPrepared");
}


@Override
public void onCompletion(MediaPlayer arg0) {
Log.e("mediaPlayer", "onCompletion");
}


@Override
public void onBufferingUpdate(MediaPlayer arg0, int bufferingProgress) {
// skbProgress.setSecondaryProgress(bufferingProgress);
// int currentProgress = skbProgress.getMax()
// * mediaPlayer.getCurrentPosition() / mediaPlayer.getDuration();
// Log.e(currentProgress + "% play", bufferingProgress + "% buffer");
}


//
/**
* 下载和缓冲文件头部数据
* */
private void prepareVideo(String remoteUrl) throws IOException {
URL url = new URL(remoteUrl);
HttpURLConnection httpConnection = (HttpURLConnection) url
.openConnection();
httpConnection.setConnectTimeout(3000);
httpConnection.setRequestProperty("RANGE", "bytes=" + 0 + "-");


InputStream is = httpConnection.getInputStream();


videoTotalSize = httpConnection.getContentLength();
if (videoTotalSize == -1) {
return;
}
String name = remoteUrl.substring(remoteUrl.lastIndexOf("/") + 1);
localUrl = Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/VideoCache/" + File.separator + name;


File cacheFile = new File(localUrl);


if (!cacheFile.exists()) {
cacheFile.getParentFile().mkdirs();
cacheFile.createNewFile();
}


RandomAccessFile raf = new RandomAccessFile(cacheFile, "rws");
raf.setLength(videoTotalSize);
raf.seek(0);


byte buf[] = new byte[10 * 1024];
int size = 0;


videoCacheSize = 0;
int buffercnt = 0;
while ((size = is.read(buf)) != -1) {
try {
raf.write(buf, 0, size);
videoCacheSize += size;
} catch (Exception e) {
e.printStackTrace();
}


// if (videoCacheSize > READY_BUFF && (buffercnt++ % 20 == 0)) {
// mHandler.sendEmptyMessage(CACHE_VIDEO_READY);
// }
}


// if (!isready) {
// mHandler.sendEmptyMessage(CACHE_VIDEO_READY);
// }
is.close();
raf.close();
handleProgress.sendEmptyMessage(1);


}


private void playMusicBySDCar(String localUrl)
throws IllegalArgumentException, SecurityException,
IllegalStateException, IOException {
// localUrl =
// "/storage/emulated/0/VideoCache/150814182212550862416.mp3";
mediaPlayer.setDataSource(localUrl);
mediaPlayer.prepare();
mediaPlayer.start();


mediaPlayer.setOnCompletionListener(new OnCompletionListener() {


@Override
public void onCompletion(MediaPlayer mp) {
// mp.pause();
mp.reset();
// if (isfirst) {// 第一次进来
// imageView.setImageResource(R.drawable.play);
// isfirst = false;
// }
if (mediaPlayer.isPlaying()) {
imageView.setImageResource(R.drawable.pause);
} else {
imageView.setImageResource(R.drawable.play);


}
// if (istrue) {
// }
}
});
}
}
创建本类对象,直接调用,playUrl();方法

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值