- 浏览: 39185 次
- 性别:
- 来自: 福州
文章分类
最新评论
-
android_madness:
ownWell 写道感觉还是用Intent好点吧 这个静态类是 ...
tabhost如何传递参数 -
ownWell:
感觉还是用Intent好点吧 这个静态类是不可取的
tabhost如何传递参数 -
xmllong:
能把关键代码放上来吗?谢谢
tabhost如何传递参数 -
zhongqiuming:
...
[Android]APK程序卸载提示 (转) -
android_madness:
yxwang0615 写道数据量太大使用静态就不是好事了说的是 ...
tabhost如何传递参数
版本检测和更新是每个应用程序必须做的一个功能,所以在这里晒下:
import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.util.Log; import android.webkit.URLUtil; import com.autoupdate.R; /** * 版本检测,自动更新 * * @author shenyj-ydrh 1.通过Url检测更新 2.下载并安装更新 3.删除临时路径 * */ public class MyAutoUpdate { // 调用更新的Activity public Activity activity = null; // 当前版本号 public int versionCode = 0; // 当前版本名称 public String versionName = ""; // 控制台信息标识 private static final String TAG = "AutoUpdate"; // 文件当前路径 private String currentFilePath = ""; // 安装包文件临时路径 private String currentTempFilePath = ""; // 获得文件扩展名字符串 private String fileEx = ""; // 获得文件名字符串 private String fileNa = ""; // 服务器地址 private String strURL = "http://127.0.0.1:8080/ApiDemos.apk"; private ProgressDialog dialog; /** * 构造方法,获得当前版本信息 * * @param activity */ public MyAutoUpdate(Activity activity) { this.activity = activity; // 获得当前版本 getCurrentVersion(); } /** * 检测更新 */ public void check() { // 检测网络 if (isNetworkAvailable(this.activity) == false) { return; } // 如果网络可用,检测到新版本 if (true) { // 弹出对话框,选择是否需要更新版本 showUpdateDialog(); } } /** * 检测是否有可用网络 * * @param context * @return 网络连接状态 */ public static boolean isNetworkAvailable(Context context) { try { ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); // 获取网络信息 NetworkInfo info = cm.getActiveNetworkInfo(); // 返回检测的网络状态 return (info != null && info.isConnected()); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 弹出对话框,选择是否需要更新版本 */ public void showUpdateDialog() { @SuppressWarnings("unused") AlertDialog alert = new AlertDialog.Builder(this.activity) .setTitle("新版本").setIcon(R.drawable.ic_launcher) .setMessage("是否更新?") .setPositiveButton("是", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // 通过地址下载文件 downloadTheFile(strURL); // 显示更新状态,进度条 showWaitDialog(); } }) .setNegativeButton("否", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }).show(); } /** * 显示更新状态,进度条 */ public void showWaitDialog() { dialog = new ProgressDialog(activity); dialog.setMessage("正在更新,请稍候..."); dialog.setIndeterminate(true); dialog.setCancelable(true); dialog.show(); } /** * 获得当前版本信息 */ public void getCurrentVersion() { try { // 获取应用包信息 PackageInfo info = activity.getPackageManager().getPackageInfo( activity.getPackageName(), 0); this.versionCode = info.versionCode; this.versionName = info.versionName; } catch (NameNotFoundException e) { e.printStackTrace(); } } /** * 截取文件名称并执行下载 * * @param strPath */ private void downloadTheFile(final String strPath) { // 获得文件文件扩展名字符串 fileEx = strURL.substring(strURL.lastIndexOf(".") + 1, strURL.length()) .toLowerCase(); // 获得文件文件名字符串 fileNa = strURL.substring(strURL.lastIndexOf("/") + 1, strURL.lastIndexOf(".")); try { if (strPath.equals(currentFilePath)) { doDownloadTheFile(strPath); } currentFilePath = strPath; new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { // 执行下载 doDownloadTheFile(strPath); } catch (Exception e) { Log.e(TAG, e.getMessage(), e); } } }).start(); } catch (Exception e) { e.printStackTrace(); } } /** * 执行新版本进行下载,并安装 * * @param strPath * @throws Exception */ private void doDownloadTheFile(String strPath) throws Exception { Log.i(TAG, "getDataSource()"); // 判断strPath是否为网络地址 if (!URLUtil.isNetworkUrl(strPath)) { Log.i(TAG, "服务器地址错误!"); } else { URL myURL = new URL(strPath); URLConnection conn = myURL.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); if (is == null) { throw new RuntimeException("stream is null"); } //生成一个临时文件 File myTempFile = File.createTempFile(fileNa, "." + fileEx); // 安装包文件临时路径 currentTempFilePath = myTempFile.getAbsolutePath(); FileOutputStream fos = new FileOutputStream(myTempFile); byte buf[] = new byte[128]; do { int numread = is.read(buf); if (numread <= 0) { break; } fos.write(buf, 0, numread); } while (true); Log.i(TAG, "getDataSource() Download ok..."); dialog.cancel(); dialog.dismiss(); // 打开文件 openFile(myTempFile); try { is.close(); } catch (Exception ex) { Log.e(TAG, "getDataSource() error: " + ex.getMessage(), ex); } } } /** * 打开文件进行安装 * * @param f */ private void openFile(File f) { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(android.content.Intent.ACTION_VIEW); // 获得下载好的文件类型 String type = getMIMEType(f); // 打开各种类型文件 intent.setDataAndType(Uri.fromFile(f), type); // 安装 activity.startActivity(intent); } /** * 删除临时路径里的安装包 */ public void delFile() { Log.i(TAG, "The TempFile(" + currentTempFilePath + ") was deleted."); File myFile = new File(currentTempFilePath); if (myFile.exists()) { myFile.delete(); } } /** * 获得下载文件的类型 * * @param f * 文件名称 * @return 文件类型 */ private String getMIMEType(File f) { String type = ""; // 获得文件名称 String fName = f.getName(); // 获得文件扩展名 String end = fName .substring(fName.lastIndexOf(".") + 1, fName.length()) .toLowerCase(); if (end.equals("m4a") || end.equals("mp3") || end.equals("mid") || end.equals("xmf") || end.equals("ogg") || end.equals("wav")) { type = "audio"; } else if (end.equals("3gp") || end.equals("mp4")) { type = "video"; } else if (end.equals("jpg") || end.equals("gif") || end.equals("png") || end.equals("jpeg") || end.equals("bmp")) { type = "image"; } else if (end.equals("apk")) { type = "application/vnd.android.package-archive"; } else { type = "*"; } if (end.equals("apk")) { } else { type += "/*"; } return type; } }
发表评论
-
学Android开发不可不知的Android应用程序四大组件(转)
2012-03-12 23:15 991Android的一个核心特性就 ... -
[Android]APK程序卸载提示 (转)
2012-01-29 19:25 1584Android上能不能实现卸载时提示呢,比如卸载某某软件时,做 ... -
android EditText中inputType的属性列表
2012-01-10 16:54 1560android 1.5以后添加了软件虚拟键盘的功能,所以在输入 ... -
(转)解决requestFocus后依旧无法获得焦点问题
2012-01-10 11:24 4618例:有两个button,上下排列,想要实现进入这屏后,焦点默认 ... -
(转)notifyDataSetChanged() 动态更新ListView
2012-01-09 15:58 2310有时候我们需要修改已经生成的列表,添加或者修改数据,notif ... -
(转)thread,runable,区别
2011-12-27 09:14 1427使用runable最主要的原因 ... -
(转)从进程-线程的角度,理解Activity,Service,Broadcast
2011-12-26 16:08 1002写下来仅记录下困惑了 ... -
TabActivity 无法bindService 解决方法(转)
2011-12-20 12:00 608如果使用TabActivity来进行开发,并且程序需要针对Ta ... -
Service 概述
2011-12-20 10:22 760Service概念及用途: Android中的服务,它与Ac ... -
动态添加tableview
2011-12-14 14:34 1174TableLayout table=(Ta ... -
tabhost如何传递参数
2011-12-13 11:39 2338当你使用android只带tabhost的时候,你会发现不管你 ... -
ACTIVITY显示重载
2011-12-09 16:59 1362网上常用的让activity的方式无非于使用setConten ...
相关推荐
更新ScriptHookV补丁支持最新版本1.67 3028版本号 2023.8.19日更新内容 修复TrainerV.ini文件中绑定的按键函数 重新编写按键代码 解决了 呼出时候出现的按键错误 和随机刷车飞天功能BUG 以及修改器重叠BUG 2023.8....
测试工具 使用pyqt5开发 有时间戳处理 MD5获取 android 投屏 日志获取 桌面录屏。。。功能以及源码https://gitee.com/jcs1995/test_tool_adb/blob/master/README.md
需要Unity 5.2.0或更高版本。 用于将使用3dmax,Terragen或任何其他编辑器创建的3D地形模型快速转换为Unity Terrain的组件。 特征: •支持Unity v5.2 - Unity 2018.x •组件中使用的模型和地形数量无限; •地形在...
matlab的代码和图像转换行人检测 使用HOG向量和Svm进行行人检测。 这是Python中matlab版本的转换。 如果发现任何问题或错误,请更新。 模块要求 Python 2.7以上 OpenCV scikit学习 PyYAML 我建议安装Python Anaconda...
支持和 WordPress 官方主题一样的在线更新,如果有新的更新会自动推送到后台(默认每 12 个小时检测一次更新,可以通过后台的更新界面手动检测) 支持语言本地化,但是只有简体中文,其他语言可以自己翻译;针对中文...
修改结果导出到WPS(wps2005版本更新) 3).修改导出到word时的一个bug 4).把界面变小一点点,让800*600下也能显示完整 5).修改选首字母功能后,退出后再进入程序时就无法使用的bug 4.6版新增功能: 1).加入支持分词(在...
创建一个新文件-仍然可以输出具有完整性属性和版本CDN URL的脚本和链接,但是只需要将脚本/链接保存到源中的本地路径,从而避免了可能产生的版本号或完整性属性更新时较大的差异噪声。 CDN后备-选项,用于检测CDN...
英特尔提供软件和驱动程序的通用版本 如果计算机制造商改变了此设备的功能 加入了自定义设置或进行了其他改动 英特尔驱动程序更新实用程序可能识别不出此设备 收起 自动识别和查找驱动程序: 英特尔驱动程序更新...
越狱检测 关于可以用来以大大改进和更好的方式检测越狱设备的各种方法的文档。 包含越狱在iOS系统上所做的更改的差异,并... 从版本10开始必须测试和更新(尤其是phoenix,yalu,liberiOS,elektra,apptap相关更改)。
1、出于对ESET的敬重,去除了对 ESET v4.x 版本自动添加排除和ID获取后让ESET更新病毒库的功能。 1.6.7.4更新:2009-03-05 1、恢复对ESET v4.x 版本写入ID和密码、排除和ID获取后让ESET更新病毒库的支持。(唉,...
AnyBizSoft PDF Converter 也能轻松转换当前版本 AnyBizSoft PDF Converter v2.0.2,该版本有较大变化,如集成PDF转换Excel功能、无需安装 Microsoft Office 即可转换、自动识别表格等,推荐更新;而作为PDF转换软件...
该circularRNA检测管道并行使用CIRCExplorer2和CIRI2来检测,定量和注释circRNA。 这是v0.3.3的流程图: 版本/发行要点 v0.1.0 基本版本 仅支持PE v0.2.x SE支持增加了.. PE / SE样本同时处理 envmodules使用的...
广联达加密锁有驱转无驱等 测试写锁成功的锁芯型号:深思s4 2.46 64k (其余型号估计不行,用开发工具强制上传容易毁锁,不一定能用还影响退货,慎用!!) 教程: 检测加密锁是否是64K的,不是的话建议购买...
2.软件加入自动检测更新 3.优化了软件破解窗口的界面,更美观 4.加入飘零网络验证系统,支持在线购买 更新说明: 2014-08-10 1.本次更新加入防监测功能,防止网吧反破解检测 2.软件加壳更安全,防止杀毒以及安全...
4、32k和64k外壳是看不出来的 只能通过检测 广联达无驱动写锁说明 1、老锁用不了?------先检测一下型号 硬件版本2.46 空间63999字节,不是的话写不了不用试 2、关于用多久-------- 额也不知道,目前能用。至于...
新增手动检测到新版本资源库时的提示 版本 v19.01.11 新增资源库可选择联网更新功能 新增清空列表前提示确认 新增加载收藏夹前提示确认 新增可选是否启用广告过滤 新增清晰度选择保存记录 更新资源库勾选功能改为...
更新内容:1、增加检测更新功能,chrome插件和转换程序都可以自动更新了!2、新增转换组件pdfcrowd2,并将默认转换组件修改为pdfcrowd2(水印在页面底部,对阅读影响更小)。 如果你跟我一样,希望有一个只需要点一次...
MCExtrator这款工具可以解析Intel、AMD、VIA和Freescale处理器的微代码库,终端用户可以用它来查找相关的微代码信息,例如CPU ID、平台、版本、日期、型号、大小和校验和等等。该工具可以将Intel微代码容器(dat、in...
FTDI芯片是一种USB转串口芯片,能够将USB接口转换为串行通信接口,常用于嵌入式系统、自动化设备、仪器仪表等...此外,FTDI芯片还支持自动化波特率检测和自动化流控制等特性,能够大大简化串口通信的配置和调试工作。
版本号:2.2.0.Beta功能更新:1: 连拍时间和张数最小为1;2:录像是不可修改分辨率,颜色空间; 3:取消了xvid检测;版本号:2.1.4.Beta功能更新:1.取消全屏;2.添加resize,视频图像自适应;3.打开侧边栏锁定后,...