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(); }

DMIT:美国cn2 gia线路vps,高性能 AMD EPYC/不限流量(Premium Unmetered),$179.99/月起

DMIT怎么样?DMIT最近动作频繁,前几天刚刚上架了日本lite版VPS,正在酝酿上线日本高级网络VPS,又差不多在同一时间推出了美国cn2 gia线路不限流量的美国云服务器,不过价格太过昂贵。丐版只有30M带宽,月付179.99美元 !!目前,美国云服务器已经有个4个套餐,分别是,Premium(cn2 gia线路)、Lite(普通直连)、Premium Secure(带高防的cn2 gia线...

香港 E5-2650 16G 10M 900元首月 美国 E5-2660 V2 16G 100M 688元/月 华纳云

华纳云双11钜惠出海:CN2海外物理服务器终身价688元/月,香港/美国机房,免费送20G DDos防御,50M CN2或100M国际带宽可选,(文内附带测评)华纳云作为一家专业的全球数据中心基础服务提供商,总部在香港,拥有香港政府颁发的商业登记证明,APNIC 和 ARIN 会员单位。主营香港服务器、美国服务器、香港/美国OpenStack云服务器、香港高防物理服务器、美国高防服务器、香港高防I...

Gcore(75折)迈阿密E5-2623v4 CPU独立服务器

部落分享过多次G-core(gcorelabs)的产品及评测信息,以VPS主机为主,距离上一次分享商家的独立服务器还在2年多前,本月初商家针对迈阿密机房限定E5-2623v4 CPU的独立服务器推出75折优惠码,活动将在9月30日到期,这里再分享下。G-core(gcorelabs)是一家总部位于卢森堡的国外主机商,主要提供基于KVM架构的VPS主机和独立服务器租用等,数据中心包括俄罗斯、美国、日...

androidmediaplayer为你推荐
李智慧韩国艺人韩智慧最近的情况?chinapaychinapay是什么垃圾东西!iso20000认证iso20000认证流程是怎样的视频压缩算法怎样把3个1G多,1个400多MB的视频文件压缩小?但又无损音质和画面清晰度的。orphanremovalhibernate一对多,操作一的一方,如何删除多的一方的数据。腾讯公告官网公告是什么js后退javascript怎么禁用浏览器后退按钮star413匡威jack star 的后标是不是真的?如图assemblyinfoasp.net这几个文件是干什么的?鄂n鄂A鄂B鄂C鄂D鄂E鄂F鄂G鄂H鄂J鄂K鄂L鄂M鄂N鄂P鄂Q鄂R鄂S鄂T鄂U分别代表湖北省的哪些城市
美国虚拟主机购买 怎么注册域名 免费com域名申请 全球付 网络星期一 密码泄露 服务器怎么绑定域名 最好的空间 cpanel空间 刀片服务器的优势 世界测速 shopex主机 腾讯总部在哪 海外空间 重庆服务器 googlevoice cx域名 symantec 主机响 更多