androidmediaplayerandroid mediaplayer实例化失败,总会报nullpointerexception
androidmediaplayer 时间:2021-06-11 阅读:(
)
如何玩转 Android MediaPlayer之Media Proxy
HttpGetProxy.JAVA还是本文的关键部分:
[java] view plaincopyprint?
public class HttpGetProxy {
final static private String TAG = "HttpGetProxy";
final static private String LOCAL_IP_ADDRESS_1 = "127.0.0.1";
final static private String LOCAL_IP_ADDRESS_2 = "10.0.2.2";
final static private int HTTP_PORT = 80;
final static private String HTTP_END="
";
/**代理服务器使用的端口*/
private int proxy_ip_port;
/**链接带的端口*/
private String original_ip_port;
/**远程服务器地址*/
private String remoteHost;
/**本地服务器地址*/
private String localHost;
private ServerSocket localServer = null;
/**收发Media Player请求的Socket*/
private Socket sckPlayer = null;
/**收发Media Server请求的Socket*/
private Socket sckServer = null;
private SocketAddress address;
/**
* 初始化代理服务器
* @param localport 代理服务器监听的端口
*/
public HttpGetProxy(int localport) {
try {
_HttpGetProxy(LOCAL_IP_ADDRESS_1,localport);
} catch (Exception e) {
Log.e(TAG,LOCAL_IP_ADDRESS_1+"???"+e.toString());
try {
_HttpGetProxy(LOCAL_IP_ADDRESS_2,localport);
}catch (Exception e1) {
Log.e(TAG,LOCAL_IP_ADDRESS_2+"???"+e.toString());
System.exit(0);
}
}
}
private void _HttpGetProxy(String ipAddress,int localport) throws UnknownHostException, IOException {
proxy_ip_port=localport;
localServer = new ServerSocket(localport,1,Address.getByName(ipAddress));
localHost=ipAddress;
}
/**
* 把网络URL转为本地URL,127.0.0.1替换网络域名
* @param url 网络URL
* @return 本地URL
*/
public String getLocalURL(String urlString){
//----排除HTTP特殊----//
String targetUrl=ProxyUtils.getRedirectUrl(urlString);
//----获取对应本地代理服务器的链接----//
String result = null;
URI originalURI=URI.create(targetUrl);
remoteHost=originalURI.getHost();
if(originalURI.getPort()!=-1){//URL带Port
address = new SocketAddress(remoteHost,originalURI.getPort());//使用默认端口
original_ip_port = originalURI.getPort()+"";//保存端口,中转时替换
result=targetUrl.replace(remoteHost+":"+originalURI.getPort(),
localHost+":"+proxy_ip_port);
}
else{//URL不带Port
address = new SocketAddress(remoteHost,HTTP_PORT);//使用80端口
original_ip_port = "";
result=targetUrl.replace(remoteHost,localHost+":"+proxy_ip_port);
}
return result;
}
/**
* 启动代理服务器
* @throws IOException
*/
public void asynStartProxy(){
new Thread() {
public void run() {
int bytes_read;
byte[] local_request = new byte[1024];
byte[] remote_reply = new byte[1024];
while (true) {
try {
//--------------------------------------
//监听MediaPlayer的请求,MediaPlayer->代理服务器
//--------------------------------------
sckPlayer = ept();
Log.e(TAG, "..........sckPlayer connected..........");
String requestStr = "";
while ((bytes_read = sckPlayer.getInputStream().read(local_request)) != -1) {
byte[] tmpBuffer=new byte[bytes_read];
System.arraycopy(local_request,0,tmpBuffer,0,bytes_read);
String str = new String(tmpBuffer);
//Log.e("from MediaPlayer---->", str);
requestStr = requestStr + str;
if (requestStr.contains("GET")
&& requestStr.contains(HTTP_END)) {
break;
}
}
//把request中的本地ip改为远程ip
requestStr = requestStr.replace(localHost,remoteHost);
//把代理服务器端口改为原URL端口
if(TextUtils.isEmpty(original_ip_port))
requestStr = requestStr.replace(":"+proxy_ip_port, "");
else
requestStr = requestStr.replace(":"+proxy_ip_port, ":"+original_ip_port);
Log.e("to Media Server---->", requestStr);
//--------------------------------------
//把MediaPlayer的请求发到网络服务器,代理服务器->网络服务器
//--------------------------------------
sckServer = new Socket();
sckServer.connect(address);
Log.e(TAG,"..........remote Server connected..........");
sckServer.getOutputStream().write(requestStr.getBytes());//发送MediaPlayer的请求
//------------------------------------------------------
//把网络服务器的反馈发到MediaPlayer,网络服务器->代理服务器->MediaPlayer
//------------------------------------------------------
Log.e(TAG,"..........remote start to receive..........");
String responseStr = "";
boolean isCaptured=false;
while ((bytes_read = sckServer.getInputStream().read(remote_reply)) != -1) {
byte[] tmpBuffer=new byte[bytes_read];
System.arraycopy(remote_reply,0,tmpBuffer,0,bytes_read);
//----捕获收到的Response文本内容----//
if (!isCaptured) {
String str = new String(tmpBuffer);
responseStr += str;
if (responseStr.contains("HTTP/")
&& responseStr.contains(HTTP_END)) {
int endIndex=responseStr.indexOf(HTTP_END, 0);
responseStr=responseStr.substring(0, endIndex);
Log.e("from Media Server---->", responseStr);
isCaptured=true;
}
}
sckPlayer.getOutputStream().write(tmpBuffer);
sckPlayer.getOutputStream().flush();
}
Log.e(TAG, "..........over..........");
//关闭对内,对内 2个SOCKET
sckPlayer.close();
sckServer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
}android中的Mediaplayer 是不是我们每次播放一个不同的视频文件的时候.都要调用一次Prepare方法啊
没错,播放之前需要调用 prepare()准备。
Android的MediaPlayer包含了Audio和video的播放功能
关于MediaPlayer的使用方式:
1.如何获得MediaPlayer实例:
可以使用直接new的方式:
MediaPlayer mp = new MediaPlayer();
也可以使用create的方式,如:
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了
2.如何设置要播放的文件:
MediaPlayer要播放的文件主要包括3个来源:
a. 用户在应用中事先自带的resource资源
例如:MediaPlayer.create(this, R.raw.test);
b. 存储在SD卡或其他文件路径下的媒体文件
例如:mp.setDataSource("/sdcard/test.mp3");
c. 网络上的媒体文件
例如:mp.setDataSource("mp3或者mp4的地址");
3.MediaPlayer常用API
MediaPlayer的setDataSource一共四个方法:
setDataSource (String path)
setDataSource (FileDescriptor fd)
setDataSource (Context context, Uri uri)
setDataSource (FileDescriptor fd, long offset, long length)
对播放器的主要控制方法:
Android通过控制播放器的状态的方式来控制媒体文件的播放,其中:
1.prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。
2. start()是真正启动文件播放的方法
3.pause()和()比较简单,起到暂停和停止播放的作用
4.seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。
5.release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。
6.reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。
android MediaPlayer java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
从你这些程序看无法看出问题。
报的错误很明显,你的集合里面没有元素,但是你想从里面取数据。
(你也没说是哪一行报错,我觉得是不是这个集合的问题:private List mMusicList = new ArrayList();集合里面没有元素)跪求Android高手写个MediaPlayer的小程序!
可以这么考虑!简单的功能其实不难,又因为MediaPlayer极其容易出错。
所以要监听一个错误回调接口,重置MediaPlayer。
/*实例化媒体播放器*/
mPlayer=newMediaPlayer();
/**/
mPlayer.setOnErrorListener(newOnErrorListener(){
/**
*当播放器发生错误的时候回调
*/
@Override
publicbooleanonError(MediaPlayermp,intwhat,intextra){
/*当发生错误的时候重置播放器*/
mp.reset();
returnfalse;
}
});
/*播放,下一首,上一首只要传递不同的文件路径即可:*/
try{
/*重置MediaPlayer*/
mPlayer.reset();
/*设置要播放的文件路径*/
mPlayer.setDataSource(path);/*媒体文件路径*/
/*准备播放*/
mPlayer.prepare();
/*开始播放*/
mPlayer.start();
}catch(IllegalArgumentExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IllegalStateExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
/*暂停:*/
if(mPlayer.isPlaying()){
mPlayer.pause();
}
/*停止:*/
if(mPlayer.isPlaying()){
/*重置播放器*/
mPlayer.reset();
}
/*继续播放:*/
if(!mPlayer.isPlaying()){
mPlayer.start();
}android mediaplayer实例化失败,总会报nullpointerexception
从log来看,是75行这个player没有初始化啊,你是否对player这个成员实例化了,从log上可,没有实例化就是用了。
你可以改为这样
1
2
3
4
5
6
if(player?!=?null)?{
//
}
else{//加这个
player?=?newMediaPlayer();
}
国外主机测评昨天接到Hostigger(现Hostiger)商家邮件推送,称其又推出了一款特价大内存VPS,机房位于土耳其的亚欧交界城市伊斯坦布尔,核50G SSD硬盘200Mbps带宽不限月流量只要$59/年。 最近一次分享的促销信息还是5月底,当时商家推出的是同机房同配置的大内存VPS,价格是$59.99/年,不过内存只有10G,虽然同样是大内存,但想必这次商家给出16G,价格却是$59/年,...
轻云互联怎么样?轻云互联,广州轻云网络科技有限公司旗下品牌,2018年5月成立以来,轻云互联以性价比的价格一直为提供个人,中大小型企业/团队云上解决方案。本次轻云互联送上的是美国圣何塞cn2 vps(免费50G集群防御)及香港沙田cn2 vps(免费10G集群防御)促销活动,促销产品均为cn2直连中国大陆线路、采用kvm虚拟技术架构及静态内存。目前,轻云互联推出美国硅谷、圣何塞CN2GIA云服务器...
每每进入第四季度,我们就可以看到各大云服务商的促销力度是一年中最大的。一来是年底的促销节日活动比较多,二来是商家希望最后一个季度冲刺业绩。这不还没有到第四季度,我们看到有些商家已经蠢蠢欲动的开始筹备活动。比如素有低价VPS收割机之称的Virmach商家居然还没有到黑色星期五就有发布黑五促销活动。Virmach 商家有十多个数据中心,价格是便宜的,但是机器稳定性和速度肯定我们也是有数的,要不这么低的...
androidmediaplayer为你推荐
chinapay银联在线 银联在线支付 什么区别决策树分析决策数法的名词解释at89s52单片机有谁知道单片机如AT89c52,AT89s52具体是指什么含义啊?企业资源管理系统企业内部管理系统有哪些模式识别算法模式识别、神经网络、遗传算法、蚁群算法等等人工智能算法需要哪些数学知识?部署工具win10 评估和部署工具包有什么用部署工具如何使用office2016部署软件天翼校园宽带天翼校园宽带 是怎么算时间的 一个月 是指从办理那天开始 往后 30天是一个月吗 还是 办理的那天所在的那个微软操作系统下载怎样在微软官网下载windows7 64位旗舰版审计平台什么是审计工具
成都虚拟主机 yaokan永久域名经常更换 二级域名申请 新世界机房 hostmonster 分销主机 秒解服务器 新世界电讯 浙江独立 灵动鬼影 炎黄盛世 seednet 四核服务器 raid10 万网主机管理 什么是web服务器 万网空间 成都主机托管 移动王卡 google搜索打不开 更多