- 浏览: 336520 次
最新评论
-
ax003d:
你好,我使用这种方法,在gridview里显示图片,当图片数量 ...
ScrollView嵌套GridView、ListView的解决办法 -
yunzhu:
Firefox下有Xmarks书签同步插件,很好用,可以方便地 ...
开发人员应该具备的工具----欲善其事,先利其器 -
mjlixm:
Android入门:ContentProvider 学习了! ...
Android入门:ContentProvider -
bluesky329:
很好收益匪浅!
一个软件工程师的经验之谈 -
qinglongyun:
每天工作4小时的程序员
本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!
最近半年都忙着Android TV项目,在春节假期才有时间写点东西。先在这里给大家拜个年,祝大家龙年快乐...
直接进入主题:本文将会教大家如何实现一个简单的代理服务器(仅支持Http Get),与Android的MediaPlayer结合,从而可以扩展出“播放 防盗链的媒体文件”,“边播放边保存”等的功能。
本文的代码可以到这里下载:http://download.csdn.net/detail/hellogv/4047134,代码分为两个工程:
- J2SE工程:HttpGetProxy,在PC上实现简单的代理服务器,核心类是HttpGetProxy.java,非常容易使用,这里就不唠叨了直接贴出运行效果图:
- Android工程:本文重点,必须唠叨一下。MediaPlayer播放网络音频(http://blog.csdn.net/hellogv/article/details/6406732)与HttpGetProxy.java结合,通过代理服务器播放网络音频。
接下来贴出HttpGetProxy.java的原理图:
接下来贴出HttpGetProxy.java的源码:
通过RemoteSocket的out_remoteSocket可以访问防盗链资源,HttpGetProxy通过2个线程来实现转发,可以在两个线程内实现保存的功能。
- <span style="font-family:Comic Sans MS;font-size:18px;">package com.musicplayer;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.InetAddress;
- import java.net.InetSocketAddress;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.net.SocketAddress;
- import java.net.UnknownHostException;
- import android.util.Log;
- public class HttpGetProxy {
- final private String LOCAL_IP_ADDRESS = "127.0.0.1";
- final private int HTTP_PORT = 80;
- private ServerSocket localServer = null;
- private Socket localSocket = null;
- private Socket remoteSocket = null;
- private String remoteIPAddress;
- private InputStream in_remoteSocket;
- private OutputStream out_remoteSocket;
- private InputStream in_localSocket;
- private OutputStream out_localSocket;
- private interface OnFinishListener {
- void onFinishListener();
- }
- public HttpGetProxy(int localport) {
- // --------建立代理中转服务器-----------//
- try {
- localServer = new ServerSocket(localport, 1,
- InetAddress.getByName(LOCAL_IP_ADDRESS));
- } catch (UnknownHostException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- /**
- * 结束时,清除所有资源
- */
- private OnFinishListener finishListener =new OnFinishListener(){
- @Override
- public void onFinishListener() {
- System.out.println("..........release all..........");
- Log.e("---->","..........release all..........");
- try {
- in_localSocket.close();
- out_remoteSocket.close();
- in_remoteSocket.close();
- out_localSocket.close();
- localSocket.close();
- remoteSocket.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- };
- public void startProxy(String remoteIpAddr) throws IOException {
- remoteIPAddress = remoteIpAddr;
- SocketAddress address = new InetSocketAddress(remoteIPAddress,HTTP_PORT);
- // --------连接目标服务器---------//
- remoteSocket = new Socket();
- remoteSocket.connect(address);
- System.out.println("..........remote Server connected..........");
- Log.e("---->","..........remote Server connected..........");
- in_remoteSocket = remoteSocket.getInputStream();
- out_remoteSocket = remoteSocket.getOutputStream();
- System.out.println("..........init remote Server I/O..........");
- /**
- * 接收本地request,并转发到远程服务器
- */
- new Thread() {
- public void run() {
- int bytes_read;
- byte[] local_request = new byte[5120];
- try {
- // 本地Socket
- localSocket = localServer.accept();
- System.out.println("..........localSocket connected..........");
- Log.e("---->","..........localSocket connected..........");
- in_localSocket = localSocket.getInputStream();
- out_localSocket = localSocket.getOutputStream();
- System.out.println("..........init local Socket I/O..........");
- Log.e("---->","..........init local Socket I/O..........");
- String buffer = "";
- while ((bytes_read = in_localSocket.read(local_request)) != -1) {
- String str = new String(local_request);
- System.out.println("localSocket " + str);
- Log.e("localSocket---->",str);
- buffer = buffer + str;
- if (buffer.contains("GET")
- && buffer.contains("\r\n\r\n")) {
- //---把request中的本地ip改为远程ip---//
- buffer = buffer.replace(LOCAL_IP_ADDRESS,remoteIPAddress);
- System.out.println("已经替换IP");
- out_remoteSocket.write(buffer.getBytes());
- out_remoteSocket.flush();
- continue;
- } else{
- out_remoteSocket.write(buffer.getBytes());
- out_remoteSocket.flush();
- }
- }
- System.out.println("..........local finish receive...........");
- Log.e("---->","..........local finish receive..........");
- finishListener.onFinishListener();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }.start();
- /**
- * 接收远程服务器reply,并转发到本地客户端
- */
- new Thread() {
- public void run() {
- int bytes_read;
- byte[] remote_reply = new byte[5120];
- try {
- System.out.println("..........remote start to receive...........");
- Log.e("---->","..........remote start to receive..........");
- while ((bytes_read = in_remoteSocket.read(remote_reply)) != -1) {
- //System.out.println("remoteSocket " + remote_reply.length);
- //System.out.println("remoteSocket " + new String(remote_reply));
- out_localSocket.write(remote_reply, 0, bytes_read);
- out_localSocket.flush();
- }
- System.out.println("..........remote finish receive...........");
- Log.e("---->","..........remote finish receive..........");
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }.start();
- }
- }
- </span>
发表评论
-
Android入门:ContentProvider
2012-07-02 00:06 1981一、ContentProvider介绍 Cont ... -
Android入门:监听ContentProvider数据改变
2012-07-02 00:06 1440一、监听ContentProvider主要步骤 1 ... -
android 使用广播接收者监听短信和拦截外拨电话
2012-06-27 23:31 2218如果你想监听自己或者别人接收到的短信,设置黑名单等功能, ... -
android 广播接收者--BroadcastReceiver
2012-06-27 23:30 3574BroadcastReceiver初识: ... -
一个项目只使用一个Activity初探
2012-06-27 23:29 997提供一个简单案例: 1,新建一个项目 修改和添加 ... -
android 之访问WebService显示手机号码归属地
2012-06-27 23:27 1497发送XML 通过URL封装路径打开一个HttpURLC ... -
Android开发从入门到精通(8) _9
2012-04-24 21:45 2480Spinner 第八章(9) 在本节中将为Spinne ... -
Android开发从入门到精通(8) _8
2012-04-24 21:44 997RadioGroup 第八章(8) 在本章中将为Rad ... -
Android开发从入门到精通(8) _7
2012-04-24 21:43 988EditText 第八章(7) 在本节中,和上一节很类 ... -
Android开发从入门到精通(8) _6
2012-04-24 21:43 872CheckBox 第八章(6) 在本节中,将为Chec ... -
Android开发从入门到精通(8) _5
2012-04-24 21:42 906按钮 第八章(5) 看看下面的代码。这段代码代表了四个 ... -
Android开发从入门到精通(8) _4
2012-04-23 22:18 1087为AutoComplete创建一个 ... -
Android开发从入门到精通(8) _3
2012-04-23 22:17 1214使用菜单 第八章(3) 在本节中,你将建造一个应用 ... -
Android开发从入门到精通(8) _2
2012-04-23 22:17 1122修改AndroidManifest.xml文件 第八章( ... -
Android开发从入门到精通(8) _1
2012-04-23 22:16 917列表,菜单和其它Views 第八章(1) 关键技能 & ... -
Android开发从入门到精通(7) _8
2012-04-23 22:16 1116试试这个:修改AndoridPhoneDialer项目 ... -
Android开发从入门到精通(7) _7
2012-04-22 15:14 1021执行一个EditText View 第七章(7) ... -
Android开发从入门到精通(7) _6
2012-04-22 15:13 1156修改AndroidPhoneDialer 第七章(6) ... -
Android开发从入门到精通(7) _5
2012-04-22 15:13 931编辑活动许可 第七章(5) 大多数的Activit ... -
Android开发从入门到精通(7) _4
2012-04-22 15:12 1025在本节中你将会 ...
相关推荐
在基础篇之上扩展,可以支持seek,更接近实际使用。
本文是在《玩转 Android MediaPlayer之视频预加载(优化)》基础上修复Http代理服务器(Http Proxy()透传的bug。前面几篇相关文章所用的代理服务器一个时间只能监听来自Mediaplayer的一个Request请求,但在实际项目开发...
在《Android MediaPlayer与Http Proxy结合之提高篇》基础上,进一步优化代理服务器,支持了Http的302、301重定向,清晰获取Http Request和Http Response的文本内容。本文以视频播放结合Http Proxy,讲述MediaPlayer...
在Android开发中,MediaPlayer是处理音频和视频播放的核心类之一,它提供了丰富的API来控制多媒体文件的播放。本文将深入探讨如何使用MediaPlayer自定义循环播放的次数,这在需要重复播放特定音频片段的应用场景中...
Android MediaPlayer与Http Proxy案例源码,该源码案例将会教大家如何实现一个简单的代理服务器(仅支持Http Get),与Android的MediaPlayer结合,从而可以扩展出“播放 防盗链的媒体文件”,“边播放边保存”等的功能...
在Android开发中,多媒体播放是常见的功能之一,`MediaPlayer` 和 `SurfaceView` 的结合使用是实现视频播放的标准方式。本篇文章将详细讲解如何利用这两个组件来构建一个视频播放器。 首先,`MediaPlayer` 是...
在这个场景中,我们将详细探讨如何使用`MediaPlayer`来播放视频,同时结合`SurfaceView`来显示视频画面。本文将深入解析相关知识点,并提供一个实践示例。 首先,`MediaPlayer`类是Android多媒体框架的一部分,它...
MediaPlayer 在底层是基于 OpenCore(PacketVideo) 的库实现的,为了构建一个 MediaPlayer 程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是 Android 基本库中的 Binder 机制。 在本示例中,我们将使用 ...
总之,这个实例教程提供了Android开发中使用MediaPlayer播放音乐和视频的基础知识,对于初学者和有经验的开发者来说都是一个很好的学习资源。通过实践这个实例,你可以更好地理解和掌握Android多媒体播放的核心技术...
在Android开发中,`MediaPlayer`类是用于播放各种媒体文件的核心组件。它可以处理音频、视频流...在实际项目中,可能需要结合具体需求对这些基础知识进行扩展和优化,比如实现缓冲播放、视频进度控制、全屏切换等功能。
总的来说,"玩转 Android MediaPlayer之视频预加载(优化)"是关于如何在Android平台上利用MediaPlayer组件,结合网络条件、硬件能力、错误处理等多个方面,实现视频的高效预加载,提升播放体验的技术探讨。...
在这个特定的示例中,我们关注的是如何使用MediaPlayer与进度条(SeekBar)结合,创建一个简单的音频播放器。以下是对这个Android应用开发知识点的详细解析: 1. **MediaPlayer类**: MediaPlayer是Android提供的...
本篇文章将深入探讨`MediaPlayer`的使用方法,帮助开发者理解和掌握如何在Android应用中实现多媒体播放功能。 首先,创建`MediaPlayer`对象是使用它的第一步。通常,我们通过调用`MediaPlayer.create()`静态方法来...
这篇博客"Android MediaPlayer研究问题"可能深入探讨了在使用MediaPlayer过程中遇到的问题及解决方案。 首先,我们来了解MediaPlayer的基本用法。在Android中,MediaPlayer类提供了加载、控制和播放媒体文件的能力...
在Android开发中,MediaPlayer是一个非常重要的组件,它用于播放各种媒体资源,如音频和视频文件。本教程将深入探讨如何使用Android的MediaPlayer类来播放MP3格式的音频文件。了解这个知识点对于Android开发者来说至...
本篇文章将深入探讨`MediaPlayer`的高级用法,包括但不限于事件处理、流媒体播放、音量控制以及错误处理等方面。为了更好地理解这些概念,我们将通过一个名为`MediaPlayerDemo`的示例项目进行讲解。 首先,`...
`MediaPlayer`类是Android SDK中的核心组件之一,它允许开发者播放本地或网络上的媒体文件。这个类提供了丰富的API,包括播放、暂停、停止、SeekTo(定位播放位置)等操作。`MediaPlayer`的工作流程通常涉及以下几个...
**Android MediaPlayer 深度解析** 在Android平台上,多媒体处理是一个重要的功能,而`MediaPlayer`类是Android SDK提供的一种核心组件,专门用于处理音频和视频的播放。它提供了丰富的功能,如播放本地或网络资源...
在Android平台上,开发一个简单的音乐播放器应用是一个常见的任务,主要涉及到的核心组件是`MediaPlayer`。这个组件提供了音频和视频播放的功能,对于构建一个基础的音乐播放器来说,至关重要。以下将详细介绍`...