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/年,...
美国特价云服务器 2核4G 19.9元杭州王小玉网络科技有限公司成立于2020是拥有IDC ISP资质的正规公司,这次推荐的美国云服务器也是商家主打产品,有点在于稳定 速度 数据安全。企业级数据安全保障,支持异地灾备,数据安全系数达到了100%安全级别,是国内唯一一家美国云服务器拥有这个安全级别的商家。E5 2696v2x2 2核 4G内存 20G系统盘 10G数据盘 20M带宽 100G流量 1...
俄罗斯vps云服务器商家推荐!俄罗斯VPS,也叫毛子主机(毛子vps),因为俄罗斯离中国大陆比较近,所以俄罗斯VPS的延迟会比较低,国内用户也不少,例如新西伯利亚机房和莫斯科机房都是比较热门的俄罗斯机房。这里为大家整理推荐一些好用的俄罗斯VPS云服务器,这里主要推荐这三家:justhost、ruvds、justg等俄罗斯vps主机,方便大家对比购买适合自己的俄罗斯VPS。一、俄罗斯VPS介绍俄罗斯...
androidmediaplayer为你推荐
草莓派什么是草莓派?水晶易表如何在win7环境和office2010环境下成功安装水晶易表视频压缩算法关于视频压缩的原理?企业资源管理系统企业人力资源管理系统的重要性?自定义表情搜狗输入法怎么添加自定义表情js后退javascript怎么禁用浏览器后退按钮模式识别算法机器学习和模式识别有什么区别?看教材,发现它们的算法都差不多一样啊。。。审计平台什么是审计工具papertiger亚瑟士 艾斯克斯 tiger有什么区别吗移动硬盘文件或目录损坏且无法读取移动硬盘提示文件或目录损坏且无法读取,怎么修复
php虚拟空间 westhost vmsnap3 512av godaddy域名优惠码 租空间 牛人与腾讯客服对话 panel1 bgp双线 合租空间 idc是什么 域名评估 新家坡 php空间购买 华为云服务登录 vul 贵阳电信测速 国外网页代理 apnic hostease 更多