package com.yizhao.action; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.Intent; //import android.content.pm.PackageInfo; //import android.content.pm.PackageManager.NameNotFoundException; import android.database.Cursor; import android.os.Environment; import android.os.Message; import android.util.DisplayMetrics; import android.util.Log; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.yizhao.activity.CommActivityGroup; import com.yizhao.activity.R; import com.yizhao.bean.APKBean; import com.yizhao.bean.HotProductBean; import com.yizhao.bean.IRBean; import com.yizhao.blog.UserInfo; import com.yizhao.core.AsyncWorkHandler; import com.yizhao.core.CacheManager; import com.yizhao.core.Const; import com.yizhao.core.DBHelper; import com.yizhao.core.HttpManager; import com.yizhao.util.DensityUtil; import com.yizhao.util.FileUtils; public class AppStartAction { private static Activity activity; private TextView appstart_view;//启动界面提示文字对象 private AsyncWorkHandler handler_ir;//从属第三步-下载更新IR文件的对象 private AsyncWorkHandler handler_initData;//第四步-初始化系统信息及加载IR文件 private int curIndexEnd;//最终的更新结束点 private FileUtils fu;//文件操作工具 private Message message = null;//handle消息,公用 private ProgressBar progressBar = null;//进度条,用于更新APK与IR文件的进度展现 public String apk_name;//APK更新包的文件名 public String apk_url;//APK更新包地址 private ArrayList<String> ir_list;//IR所需更新文件,如ir6,ir8 private int ir_size;//IR所需更新文件个数 private int ir_curr = 1;//IR当前更新到第几个文件,默认第一个 private int ir_index;//IR更新进度条 private List<String> autoList; private String autoText; private String fileName; private long count;//加载IR文件 public boolean flagA = true; public boolean flagC = true; public boolean flagD = true; public AppStartAction(Activity _activity,TextView textview,ProgressBar _progressBar) { activity = _activity; appstart_view = textview; progressBar = _progressBar; fu = new FileUtils(); initHandler(); } private void initHandler(){ //初始化-最后初始化 handler_initData = new AsyncWorkHandler(){ @Override public Object excute(Map<String,String> map) { init(); //需要判断是否有SD卡 boolean sdCard = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); if(sdCard){ autoList = new ArrayList<String>(); if(curIndexEnd < 1){ curIndexEnd = Const.IR_LOCAL_VERSION; } for(int i = 1; i <= curIndexEnd; i++){ fileName = "ir"+i+".txt"; Log.d(Const.TAG, "IR load...fileName="+fileName); File f = new File(Environment.getExternalStorageDirectory() + "/"+Const.SD_DIR+"/"+fileName);//这是对应文件路径 if(f!=null){ try { if(f.length() > 0){ InputStream in = new BufferedInputStream(new FileInputStream(f)); BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); while(flagA && (autoText=br.readLine())!=null){ count++; message = new Message(); message.what = 1; sendMessage(message); autoList.add(autoText); } br.close(); in.close(); } } catch (FileNotFoundException e){ e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } CacheManager.getInstance().setAutocomplete_list(autoList); message = new Message(); message.what =3; sendMessage(message); } return null; }; @Override public void handleMessage(Message msg){ if (msg.what == 1) {//加载中... appstart_view.setText("正在载入"+fileName+"\n已载入"+count+"个关键字"); } else if(msg.what == 3){ if(flagA){ Toast.makeText(activity, "共载入"+count+"个关键字", Toast.LENGTH_LONG).show(); Intent it = new Intent(activity, CommActivityGroup.class); activity.startActivity(it); activity.finish(); } } } }; //初始化-异步下载-较复杂 handler_ir = new AsyncWorkHandler(){ @Override public Object excute(Map<String,String> param){ ir_size = ir_list.size(); //需要判断是否有SD卡 boolean sdCard = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); if(sdCard){ for(String ir_name : ir_list){ int ir_curr_len = 0;//当前文件的长度 long ir_hasRead = 0;//当前文件已读取长度 File tmpFile = null; InputStream inputStream = null; FileOutputStream outputStream = null; HttpURLConnection connection = null; try { String[] name_ex = ir_name.split("\\."); tmpFile = File.createTempFile(name_ex[0], name_ex[1]);//写入缓存盘 URL url = new URL(Const.IR_URL+ir_name); connection = (HttpURLConnection)url.openConnection();//开启HTTP连接 connection.setConnectTimeout(Const.TIMEOUT_15);//设置15秒超时 ir_curr_len = connection.getContentLength();//获取内容长度 Log.d(Const.TAG, "ir_name="+ir_name+",ir_curr_len="+ir_curr_len); inputStream = connection.getInputStream();//得到输入流 outputStream = new FileOutputStream(tmpFile);//文件输出流 byte[] buffer = new byte[Const.BYTE_SIZE_INT]; do{ int numread = inputStream.read(buffer); if(numread <= 0) { break; } outputStream.write(buffer, 0, numread); ir_hasRead+=numread; ir_index = (int)(ir_hasRead*100)/ir_curr_len; message = new Message(); message.what = 2; sendMessage(message); }while(flagD); }catch(FileNotFoundException e){//网络文件不存在,则发送消息通知 connection.disconnect(); message = new Message(); message.what = -2; sendMessage(message); e.printStackTrace(); }catch (Exception e) { connection.disconnect(); message = new Message(); message.what = -1; sendMessage(message); e.printStackTrace(); } finally { ir_curr++; if(connection!=null){//需要关闭,否则有可能造成网络阻塞 connection.disconnect(); } if(inputStream!=null){//输入流一定要关闭 try { inputStream.close(); } catch (IOException e) { inputStream = null; e.printStackTrace(); } } if(outputStream!=null){//输出流一定要关闭 try { outputStream.close(); } catch (IOException e) { outputStream = null; e.printStackTrace(); } } } //拷贝临时文件至目标目录 if(flagD && tmpFile!=null && (tmpFile.length()==ir_curr_len)){ try { File targetFile = null; File dir = fu.createSDDir(Const.SD_DIR);//创建目录 targetFile = fu.createSDFile(dir.getAbsolutePath()+"/"+ir_name);//创建新文件 fu.copyFile(tmpFile, targetFile); fu.delFile(tmpFile.getAbsolutePath()); }catch (IOException e) { e.printStackTrace(); } } } message = new Message(); message.what = 1; sendMessage(message); }else{ message = new Message(); message.what = 3; sendMessage(message); } return null; }; @Override public void handleMessage(Message msg){ if (msg.what == 2) {//下载中,下载正常 progressBar.setProgress(ir_index); appstart_view.setText("共需更新"+ir_size+"个文件,正下载第 "+ir_curr+"个文件,已下载 "+ir_index+"%"); }else if(msg.what == 3){//下载不正常,没有SD卡 if(flagD){ Toast.makeText(activity, R.string.download_nosdcard, Toast.LENGTH_SHORT).show(); appstart_view.setText(R.string.appstart_initing); handler_initData.doWork(null); } }else if (msg.what == 1){//全部下载完成 if(flagD){ progressBar.setProgress(100); appstart_view.setText(R.string.downloaded); handler_initData.doWork(null); } }else if(msg.what == -1){//文件下载异常 Toast.makeText(activity, "第"+ir_curr+"个文件下载失败!", Toast.LENGTH_LONG).show(); }else if(msg.what == -2){//下载不正常,网络文件没找到 Toast.makeText(activity, "第"+ir_curr+"个文件下载失败,文件不存在!", Toast.LENGTH_LONG).show(); } } }; } /** * 启动界面初始化部分信息 */ private boolean init(){ Log.d(Const.TAG, "AppStartInit.init start..."); initBlogInfo(); Log.d(Const.TAG, "AppStartInit.init blog login info success..."); initDisplayPx(); Log.d(Const.TAG, "AppStartInit.init display info success..."); initIndexData(); Log.d(Const.TAG, "AppStartInit.init index data success..."); return true; } /** * 初始化数据库及建立数据表,初始化微博分享登录key */ private void initBlogInfo(){ DBHelper dbHelp = new DBHelper(activity); if(dbHelp!=null){ Cursor cursor_sina = dbHelp.readUser("sina"); if(cursor_sina!=null){ if(!cursor_sina.isAfterLast()){ cursor_sina.moveToFirst(); UserInfo user = new UserInfo(); user.setToken(cursor_sina.getString(1)); user.setTokenSecret(cursor_sina.getString(2)); CacheManager.getInstance().setUser_sina(user); Log.d(Const.TAG, "AppStartInit.initBlogInfo|sina user="+user); } cursor_sina.close(); } Cursor cursor_tx = dbHelp.readUser("tencent"); if(cursor_tx!=null){ if(!cursor_tx.isAfterLast()){ cursor_tx.moveToFirst(); UserInfo user = new UserInfo(); user.setToken(cursor_tx.getString(1)); user.setTokenSecret(cursor_tx.getString(2)); CacheManager.getInstance().setUser_tx(user); Log.d(Const.TAG, "AppStartInit.initBlogInfo|tencent user="+user); } cursor_tx.close(); } dbHelp.close(); } } /** * 初始化本地IR文件 */ public void initLocalIR(){ boolean sdCard = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);//需要判断是否有SD卡 if(sdCard){ File dir = fu.createSDDir(Const.SD_DIR); for(int i = 1; i <=Const.IR_LOCAL_VERSION; i++){ String fileName = "ir"+i+".txt"; String f[] = fileName.split("\\."); if(f.length==2){//文件格式验证合法性 InputStream inputStream = null; String sdcard_filepath = Const.SD_DIR+"/"+fileName; File old_file = fu.isFileExist(sdcard_filepath); if(old_file==null || old_file.length() < 1){ try { old_file = fu.createSDFile(dir.getPath()+"/"+fileName);//创建新文件 } catch (IOException e) { old_file = null; e.printStackTrace(); } File new_file = null; try { inputStream = activity.getResources().getAssets().open(fileName); new_file = fu.writeFile2SDFromInput(Const.SD_DIR_TMP, fileName, inputStream); } catch (IOException e) { inputStream = null; new_file = null; e.printStackTrace(); } if(new_file!=null && old_file!=null){ fu.copyFile(new_file, old_file); fu.delFile(new_file.getAbsolutePath()); } } } } } } /** * 检测IR版本 * @return */ public int checkIR(){ int hasNewIR = 0; FileUtils fu = new FileUtils(); IRBean ir_bean = AppAction.checkIR(); if(ir_bean!=null && "true".equals(ir_bean.getResult()) && ir_bean.getCurFile()!=null && !"".equals(ir_bean.getCurFile())){ String curFileName = ir_bean.getCurFile();//需更新的文件名 int _sub1 = curFileName.indexOf("."); if(_sub1 > -1){ String[] tmp = curFileName.split("\\."); curFileName = tmp[0]; int sub2 = curFileName.indexOf("ir"); if(sub2 > -1){ curFileName = curFileName.substring(sub2+2,curFileName.length()); try{ curIndexEnd = Integer.parseInt(curFileName); }catch(Exception e){ curIndexEnd = -1; e.printStackTrace(); } } } } if(curIndexEnd > 0){ ir_list = new ArrayList<String>(); for(int i = 1; i <=curIndexEnd; i++){ if(flagC){ try { String ir_name = "ir"+i+".txt"; HttpManager hm = new HttpManager(Const.IR_URL+ir_name); long newsize = hm.getContentLength();//获取新文件大小 long oldsize = fu.readFileSize(Const.SD_DIR+"/"+ir_name);//获取老文件大小 Log.d(Const.TAG, "AppStartAction.checkIR|"+ir_name+" old size="+oldsize+",new size="+newsize); if(oldsize!=newsize){ ir_list.add(ir_name); } }catch (Exception e){//网络异常 e.printStackTrace(); } } } if(ir_list.size() > 0){ Log.d(Const.TAG, "AppStartAction.checkIR|ir_list.size="+ir_list.size()); hasNewIR = 1; } } Log.d(Const.TAG, "AppStartAction.checkIR|hasNewIR="+hasNewIR); return hasNewIR; } /** * 初始化屏幕分辨率信息,设定获取图片的大中小像素,初始化网络图片需要拉取的大小,根据dp计算得来 */ private void initDisplayPx(){ DisplayMetrics dm = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(dm); CacheManager.getInstance().setDisplay_pix_width(dm.widthPixels); CacheManager.getInstance().setDisplay_pix_height(dm.heightPixels); int b_pic_px = 0; int m_pic_px = 0; int s_pic_px = 0; if(dm.widthPixels > 1000){//若分辨率宽度大于1000,则统一用此规格 b_pic_px = 380; m_pic_px = 280; s_pic_px = 180; }else{//否则使用dp转换实际pix DensityUtil du = new DensityUtil(dm); b_pic_px = du.dip2px(160); m_pic_px = du.dip2px(130); s_pic_px = du.dip2px(120); } CacheManager.getInstance().setPic_b_option(Const.PIC_OPTION.replace("?", String.valueOf(b_pic_px))); CacheManager.getInstance().setPic_m_option(Const.PIC_OPTION.replace("?", String.valueOf(m_pic_px))); CacheManager.getInstance().setPic_s_option(Const.PIC_OPTION.replace("?", String.valueOf(s_pic_px))); Log.d(Const.TAG, "AppStartInit.initDisplayPx|b_pic_px="+b_pic_px+",m_pic_px="+m_pic_px+",s_pic_px="+s_pic_px); } /** * 获取首页热门信息,写入Cache */ private void initIndexData(){ HotProductBean hostProductBean = ProductAction.getHotProduct(); if(hostProductBean!=null){ CacheManager.getInstance().setHostProductBean(hostProductBean); } } // /** // * 获取当前软件版本 // */ // private void getCurrentVersion() throws NameNotFoundException{ // PackageInfo info = activity.getPackageManager().getPackageInfo(activity.getPackageName(),0); // // if(info!=null){ // this.versionName = info.versionName; // this.currVersion = Float.parseFloat(info.versionName); // } // // Log.d(Const.TAG, "AppStartInit.getCurrentVersion|currVersion="+currVersion+",versionName="+versionName); // // } /** * 检测软件版本 * @return 0无需更新 1需更新 */ public int checkVersion(){ int hasNewVersion = 0; APKBean bean = AppAction.checkVersion(); if(bean!=null && "true".equals(bean.getResult())){ try{ float version = Float.parseFloat(bean.getVersion()); String url = bean.getUrl(); apk_name = url.substring(url.lastIndexOf("/") + 1,url.length()); apk_url = url; //apk_url = url.contains(Const.HTTPHEAD)?url:null; if(version > Const.APK_Version){ hasNewVersion = 1; } }catch(Exception e){} } Log.d(Const.TAG, "AppStartAction.checkVersion|hasNewVersion="+hasNewVersion); return hasNewVersion; } public AsyncWorkHandler getHandler_initData() { return handler_initData; } public AsyncWorkHandler getHandler_ir() { return handler_ir; } }