使用下载类:
XmlFileDownloadThread p2pFileThread = new XmlFileDownloadThread(
"http://my.7po.com/api/check/yuanli.php?macnum=" + mac,
true, VideoPlayerActivity.this);
XmlFileDownloadThread tvFileThread = new XmlFileDownloadThread(
Constant.url_tv_new, false, VideoPlayerActivity.this);
p2pFileThread.execute();
tvFileThread.execute();
文件下载到本地的类:
package com.qipo.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.content.Context;
import android.os.AsyncTask;
public class XmlFileDownloadThread extends AsyncTask<String, Integer, Void>{
private String mSavePath = null;
private String urlString = null;
private boolean tagP2p;
private Context mContext;
private File xmlFile = null;
public XmlFileDownloadThread(String urlString, boolean tagP2p,
Context mContext) {
this.urlString = urlString;
this.tagP2p = tagP2p;
this.mContext = mContext;
}
protected Void doInBackground(String... params) {
try {
// if
// (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
// {
// String sdpath = Environment.getExternalStorageDirectory() + "/";
String sdpath = mContext.getFilesDir().toString() + "/";
mSavePath = sdpath + "qipotv";
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
File file = new File(mSavePath);
if (!file.exists()) {
file.mkdir();
chmodPath(file.getAbsolutePath());
}
if (tagP2p) {
xmlFile = new File(mSavePath, "7pop2p.xml");
} else {
xmlFile = new File(mSavePath, "7potv.xml");
}
if (xmlFile.exists()) {
xmlFile.delete();
}
xmlFile.createNewFile();
FileOutputStream fos = new FileOutputStream(xmlFile);
int numread = 0;
byte buf[] = new byte[1024];
while ((numread = is.read(buf)) > 0) {
fos.write(buf, 0, numread);
}
fos.close();
is.close();
// }
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
if (xmlFile.exists()) {
xmlFile.delete();
}
e.printStackTrace();
}
return null;
}
// public void run() {
// try {
// String sdpath = mContext.getFilesDir().toString() + "/";
// mSavePath = sdpath + "qipotv";
//
// URL url = new URL(urlString);
// HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// conn.connect();
// InputStream is = conn.getInputStream();
//
// File file = new File(mSavePath);
// if (!file.exists()) {
// file.mkdir();
// chmodPath(file.getAbsolutePath());
// }
//
// if (tagP2p) {
// xmlFile = new File(mSavePath, "7pop2p.xml");
// } else {
// xmlFile = new File(mSavePath, "7potv.xml");
// }
// if (xmlFile.exists()) {
// xmlFile.delete();
// }
// xmlFile.createNewFile();
// FileOutputStream fos = new FileOutputStream(xmlFile);
// int numread = 0;
// byte buf[] = new byte[1024];
//
// while ((numread = is.read(buf)) > 0) {
// fos.write(buf, 0, numread);
// }
// fos.close();
// is.close();
// } catch (MalformedURLException e) {
// e.printStackTrace();
// } catch (IOException e) {
// if (xmlFile.exists()) {
// xmlFile.delete();
// }
// e.printStackTrace();
// }
// }
public static boolean chmodPath(String path) {
boolean issuccess = false;
Process process = null;
try {
process = Runtime.getRuntime().exec("chmod 777 " + path);
issuccess = process.waitFor() == 0;
} catch (Exception e) {
e.printStackTrace();
issuccess = false;
}
return issuccess;
}
}
解析本地的xml和接口的xml不同之处就是 XmlPullParser的实例parser设置的输出流是:parser.setInput(inputStream, null);的inputStream:
本地的流:
String sdpath =mContext.getFilesDir().toString()+"/";
String mSavePath = sdpath + "qipotv";
File xmlFile = new File(mSavePath, "7potv.xml");
try{
if(xmlFile.exists()){
inputStream = new FileInputStream(xmlFile);
}else{
return null;
}
接口的流:
InputStream inputStream = null;
try {
final HttpPost post=new HttpPost(url);
// final HttpGet get = new HttpGet(url);
HttpResponse response = mHttpClient.execute(post);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
final HttpEntity entity = response.getEntity();
if (entity != null) {
inputStream = entity.getContent();
}
}
} catch (IOException e) {
Log.w(TAG, "Error while retrieving XML file " + url, e);
return null;
}
本地解析:
package com.qipo.api;
import com.qipo.bean.Channel;
import com.qipo.bean.TvList;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.content.Context;
import android.net.http.AndroidHttpClient;
import android.os.Environment;
import android.util.Log;
public class TvListDownloadPullParser extends XmlPullParserBase {
private static final String TAG = "TvListXmlPullParser";
public static TvList getTvList(Context mContext) {
TvList tvlist = new TvList();
ArrayList<Channel> channelList = new ArrayList<Channel>();
AndroidHttpClient mHttpClient = AndroidHttpClient
.newInstance("Android");
Channel element=null;
ArrayList<String> urlList=null;
XmlPullParser parser = null;
FileInputStream inputStream=null;
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
parser = factory.newPullParser();
} catch (XmlPullParserException e) {
Log.e(TAG, "Unable to create XmlPullParser", e);
return null;
}
// if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
// {
// String sdpath = Environment.getExternalStorageDirectory() + "/";
String sdpath =mContext.getFilesDir().toString()+"/";
String mSavePath = sdpath + "qipotv";
File xmlFile = new File(mSavePath, "7potv.xml");
try{
if(xmlFile.exists()){
inputStream = new FileInputStream(xmlFile);
}else{
return null;
}
}catch(FileNotFoundException e){
Log.w(TAG, "Error while new XML file from ", e);
return null;
}
try {
if(inputStream!=null){ //xlh_add
parser.setInput(inputStream, null);
}
} catch (XmlPullParserException e) {
Log.w(TAG, "Error while reading XML file from ", e);
return null;
}
// }
if (parser != null) {
try {
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
String name = parser.getName();
if (name.equals("header")) {
tvlist.setServer(parser.getAttributeValue(null,
"server"));
String s = parser
.getAttributeValue(null, "classes");
if (s != null) {
HashMap<Integer, String> menu = new HashMap<Integer, String>();
ArrayList<Integer> ids = new ArrayList<Integer>();
String[] ss = s.trim().split(",");
for (int i = 0; i < ss.length; i++) {
String[] stemp = ss[i].trim().split("-");
menu.put(Integer.parseInt(stemp[0]),
stemp[1]); // key-menu
ids.add(Integer.parseInt(stemp[0])); // keylist
}
tvlist.setMenu(menu);
tvlist.setIds(ids);
}
} else if (name.equals("channel")) {
urlList=new ArrayList<String>();
element = new Channel();
element.setId(parser.getAttributeValue(null, "id")); // id
element.setclassnum(parser.getAttributeValue(null, "classnum"));
element.setUrl(parser
.getAttributeValue(null, "src"));
element.setEpg(parser
.getAttributeValue(null, "epg"));
element.setIcon(parser.getAttributeValue(null,
"icon"));
element.setTitle(parser.getAttributeValue(null,
"name"));
element.setCid(parser
.getAttributeValue(null, "cid"));
element.setTn(Integer.parseInt(parser
.getAttributeValue(null, "tn")));
element.setType(parser.getAttributeValue(null,
"class"));
element.setHimg(parser.getAttributeValue(null,
"himg"));
}else if(name.equalsIgnoreCase("url")){
urlList.add(parser.nextText().trim());
}
}else if(eventType ==XmlPullParser.END_TAG){
if(parser.getName().equalsIgnoreCase("channel")){
element.setUrlList(urlList);
element.setTn(urlList.size());
channelList.add(element);
}
}
eventType = parser.next();
}
} catch (MalformedURLException e) {
Log.i(TAG, e.toString());
return null;
} catch (IOException e) {
Log.i(TAG, e.toString());
return null;
} catch (XmlPullParserException e) {
Log.i(TAG, e.toString());
return null;
} finally {
if (mHttpClient != null) {
mHttpClient.close();
}
}
tvlist.setChannels(channelList);
return tvlist;
}
return null;
}
}
解析的xml格式: