在起初播放的之后获得音频焦点
// 获取音频焦点
if (!audioFocusManager.requestAudioFocus()) {
Log.e(TAG, "获取音频焦点失败");
}
在暂定、停止和释放资源的之后取消音频焦点
// 取消音频焦点
if (audioFocusManager != null) {
audioFocusManager.abandonAudioFocus();
}
这里使用了AndroidVideoCache做本地缓存。
添加AndroidVideoCache依赖

dependencies {
implementation'com.danikula:videocache:2.7.0'
}
自定义缓存文件命名规则
public class CacheFileNameGenerator implements FileNameGenerator {
private static final String TAG = "CacheFileNameGenerator";
/**
* @param url
* @return
*/
@Override
public String generate(String url) {
Uri uri = Uri.parse(url);
List<String> pathSegList = uri.getPathSegments();
String path = null;
if (pathSegList != null && pathSegList.size() > 0) {
path = pathSegList.get(pathSegList.size() - 1);
} else {
path = url;
}
Log.d(TAG, "generate return " + path);
return path;
}
}
创建单例的AndroidVideoCache实例的方式
public class HttpProxyCacheUtil {
private static HttpProxyCacheServer audioProxy;
public static HttpProxyCacheServer getAudioProxy() {
if (audioProxy== null) {
audioProxy= new HttpProxyCacheServer.Builder(MyApplication.getContext())
.cacheDirectory(CachesUtil.getMediaCacheFile(CachesUtil.AUDIO))
.maxCacheSize(1024 * 1024 * 1024) // 缓存大小
.fileNameGenerator(new CacheFileNameGenerator())
.build();
}
return audioProxy;
}
}
使用AndroidVideoCache进行缓存,只要将url经过HttpProxyCacheServer转化就可以了,AndroidVideoCache会处理缓存
String url = "XXXXXXXXXXX";
HttpProxyCacheServer proxy = HttpProxyCacheUtil.getAudioProxy()
url = proxy.getProxyUrl(url);
播放时不同的状况,并借助广播的方式通告UI做出响应。

创建一个基类的BasePlayReceiver,接收初始化信息完成、资源准备完成、资源播放完成、播放状况改变、缓冲进度和播放错误等广播
public abstract class BasePlayReceiver extends BroadcastReceiver {
public static String ACTION = "com.example.android.myapplication.PLAY_RECEIVER";
public static String EXTRA_TYPE = "type";
public static String TYPE_ON_INIT_SOURCE = "onInitSource";
public static String EXTRA_SOURCE = "source";
public static String TYPE_ON_PREPARED = "onPrepared";
public static String TYPE_ON_COMPLETION = "onCompletion";
public static String TYPE_ON_PLAY_STATUS = "onPlayStatus";
public static String TYPE_ON_BUFFERING_UPDATE = "onBufferingUpdate";
public static String EXTRA_PERCENT = "percent";
public static String TYPE_ON_ERROR = "onError";
public static String EXTRA_WHAT = "what";
public static String EXTRA_EXTRA = "extra";
public static void registerReceiver(Context context, BasePlayReceiver basePlayReceiver) {
IntentFilter filter = new IntentFilter();
filter.addAction(BasePlayReceiver.ACTION);
//注册
context.registerReceiver(basePlayReceiver, filter);
}
public static void unregisterReceiver(Context context, BasePlayReceiver basePlayReceiver) {
if (basePlayReceiver != null) {
context.unregisterReceiver(basePlayReceiver);
}
}
public static void sendBroadcastInitSource(Context context, AlbumProgramItemBean song) {
Intent intent = new Intent();
intent.setAction(BasePlayReceiver.ACTION);
intent.putExtra(BasePlayReceiver.EXTRA_TYPE, TYPE_ON_INIT_SOURCE);
intent.putExtra(BasePlayReceiver.EXTRA_SOURCE, song);
context.sendBroadcast(intent);
}
public static void sendBroadcastPrepared(Context context) {
Intent intent = new Intent();
intent.setAction(BasePlayReceiver.ACTION);
intent.putExtra(BasePlayReceiver.EXTRA_TYPE, TYPE_ON_PREPARED);
context.sendBroadcast(intent);
}
public static void sendBroadcastCompletion(Context context) {
Intent intent = new Intent();
intent.setAction(BasePlayReceiver.ACTION);
intent.putExtra(BasePlayReceiver.EXTRA_TYPE, TYPE_ON_COMPLETION);
context.sendBroadcast(intent);
}
public static void sendBroadcastPlayStatus(Context context) {
Intent intent = new Intent();
intent.setAction(BasePlayReceiver.ACTION);
intent.putExtra(BasePlayReceiver.EXTRA_TYPE, TYPE_ON_PLAY_STATUS);
context.sendBroadcast(intent);
}
public static void sendBroadcastBufferingUpdate(Context context, int percent) {
Intent intent = new Intent();
intent.setAction(BasePlayReceiver.ACTION);
intent.putExtra(BasePlayReceiver.EXTRA_TYPE, TYPE_ON_BUFFERING_UPDATE);
intent.putExtra(BasePlayReceiver.EXTRA_PERCENT, percent);
context.sendBroadcast(intent);
}
public static void sendBroadcastError(Context context, int what, int extra) {
Intent intent = new Intent();
intent.setAction(BasePlayReceiver.ACTION);
intent.putExtra(BasePlayReceiver.EXTRA_TYPE, TYPE_ON_ERROR);
intent.putExtra(BasePlayReceiver.EXTRA_WHAT, what);
intent.putExtra(BasePlayReceiver.EXTRA_EXTRA, extra);
context.sendBroadcast(intent);
}
@Override
public void onReceive(Context context, Intent intent) {
if (!BasePlayReceiver.ACTION.equals(intent.getAction()) || intent.getExtras() == null) {
return;
}
Bundle bundle = intent.getExtras();
String type = bundle.getString(EXTRA_TYPE);
if (TYPE_ON_INIT_SOURCE.equals(type)) {
onInitSource((AlbumProgramItemBean) bundle.getParcelable(EXTRA_SOURCE));
} else if (TYPE_ON_PREPARED.equals(type)) {
onPrepared();
} else if (TYPE_ON_COMPLETION.equals(type)) {
onCompletion();
} else if (TYPE_ON_PLAY_STATUS.equals(type)) {
onPlayStatus();
} else if (TYPE_ON_BUFFERING_UPDATE.equals(type)) {
onBufferingUpdate(bundle.getInt(EXTRA_PERCENT));
} else if (TYPE_ON_ERROR.equals(type)) {
onError(bundle.getInt(EXTRA_WHAT), bundle.getInt(EXTRA_EXTRA));
}
}
/**
* 初始化信息
*
* @param source
*/
protected abstract void onInitSource(AlbumProgramItemBean source);
/**
* 资源准备完成
*/
protected abstract void onPrepared();
/**
* 资源播放完成
*/
protected abstract void onCompletion();
/**
* 播放状态的改变
*/
protected abstract void onPlayStatus();
/**
* 缓存进度
*
* @param percent
*/
protected abstract void onBufferingUpdate(int percent);
/**
* 播放错误
*
* @param what
* @param extra
*/
protected abstract void onError(int what, int extra);
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-120690-2.html
屈臣氏的广告
靠发股发财