- 浏览: 41083 次
- 性别:
- 来自: 福州
文章分类
最新评论
-
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 1040Android的一个核心特性就 ... -
[Android]APK程序卸载提示 (转)
2012-01-29 19:25 1691Android上能不能实现卸载时提示呢,比如卸载某某软件时,做 ... -
android EditText中inputType的属性列表
2012-01-10 16:54 1626android 1.5以后添加了软件虚拟键盘的功能,所以在输入 ... -
(转)解决requestFocus后依旧无法获得焦点问题
2012-01-10 11:24 4723例:有两个button,上下排列,想要实现进入这屏后,焦点默认 ... -
(转)notifyDataSetChanged() 动态更新ListView
2012-01-09 15:58 2376有时候我们需要修改已经生成的列表,添加或者修改数据,notif ... -
(转)thread,runable,区别
2011-12-27 09:14 1474使用runable最主要的原因 ... -
(转)从进程-线程的角度,理解Activity,Service,Broadcast
2011-12-26 16:08 1050写下来仅记录下困惑了 ... -
TabActivity 无法bindService 解决方法(转)
2011-12-20 12:00 650如果使用TabActivity来进行开发,并且程序需要针对Ta ... -
Service 概述
2011-12-20 10:22 829Service概念及用途: Android中的服务,它与Ac ... -
动态添加tableview
2011-12-14 14:34 1213TableLayout table=(Ta ... -
tabhost如何传递参数
2011-12-13 11:39 2431当你使用android只带tabhost的时候,你会发现不管你 ... -
ACTIVITY显示重载
2011-12-09 16:59 1402网上常用的让activity的方式无非于使用setConten ...
相关推荐
2. **数据格式变化**:随着软件的更新,内部数据格式可能会发生变化,这可能导致低版本无法识别高版本文件。 3. **丢失细节**:在转换过程中,某些高版本特有的细节或设置可能会丢失。 4. **插件冲突**:高版本可能...
在IT行业中,开发工具的更新迭代是常态,Visual Studio(VS)作为微软推出的强大集成开发环境,也经历了多个版本的升级。"Visual Studio 项目版本之间转换"这一主题,涉及的是如何在不同版本的VS之间迁移和管理项目...
选择所需版本,按照提示操作,等待片刻,游戏就会被更新到选定的版本。 需要注意的是,转换版本可能会对游戏的存档和自定义地图产生影响。有些较旧的地图可能无法在新版本中正常运行,反之亦然。因此,建议在转换前...
工具会自动检测用户的系统配置,判断是否满足升级条件,然后自动下载必要的更新文件,并开始安装。在这个过程中,用户无需手动参与任何复杂的步骤,大大减少了升级的复杂性和不确定性。 在技术层面,“Win11版本...
《Haclon脏污检测(更新版):深入理解屏幕缺陷检测...不断更新迭代的版本,证明了其在应对屏幕缺陷检测挑战方面的决心与实力。随着科技的进步,我们可以期待它在未来发挥更大的作用,推动整个行业的质量标准不断提升。
2. **版本检测**:程序需要能够读取MXD文件的元数据,确定其当前版本,然后与目标版本进行比较。 3. **转换逻辑**:使用ARCGIS的ArcObjects库,该库提供了对ARCGIS内部对象模型的访问,包括MXD文件。通过编程接口...
在这个版本中,JDK支持32位和64位操作系统,这使得开发者可以根据自己的硬件环境选择合适的版本。 **1. JDK的组成部分** JDK主要由以下几个部分组成: - **Java编译器(javac)**:用于将源代码转换为字节码的工具...
此过程会更新项目文件的格式和配置,以适应新版本的要求。 2. **转换风险**:虽然自动转换通常是安全的,但并非所有项目都可无缝转换。某些旧特性可能在新版本中已被弃用,或者新版本可能引入了与旧代码不兼容的...
YOLOv5在前几代的基础上进行了多方面的改进,包括网络结构的优化、训练策略的更新以及损失函数的设计,从而在速度和精度之间取得了更好的平衡。 在"基于YOLOv5的旋转目标检测系统源码+模型.zip"这个压缩包中,包含...
- **定时器0中断服务程序**:`void timer0() interrupt 1 {...}` 在定时器0中断发生时,更新定时器0的值,并进行显示逻辑处理,包括选择要显示的数码管段和更新显示数据。 ### 总结 通过以上分析,我们可以看到51...
YOLOv5是YOLO系列的最新版本,由Joseph Redmon等人开发,以其高效、准确和易于训练的特点而闻名。它采用了卷积神经网络(CNN)架构,通过单个前向传递就能完成对图像中物体的分类和定位。然而,原版的YOLOv5仅支持...
在Android应用开发中,自动检测版本和自动升级是提高用户体验的重要功能。这使得应用程序能够及时地获取最新的功能和修复,而无需用户手动检查或下载更新。以下是对这一过程的详细解释: 1. **检测当前版本信息**:...
此工具的版本号为3.0.0.0,表明它可能已经经历了多次更新和优化,提供了更为稳定和高效的功能。"正式版V2"的标签暗示这是一次重要的更新迭代,相较于之前的版本,可能引入了新的特性或修复了已知问题。 Visual ...
YOLO(You Only Look Once)是一种高效且准确的目标检测框架,自2016年首次提出以来,经过多次迭代更新,现在已经发展到yolov5版本。本主题聚焦于yolov5在处理旋转目标检测上的应用,这是一个在实际场景中经常遇到的...
2. 安装顺序:通常,应先插入USB转RS232适配器,然后安装驱动程序,让操作系统能够自动检测并安装。 3. 设备管理器检查:如果驱动安装后设备仍然无法正常工作,可以在设备管理器中查看是否存在错误,或者尝试更新...
在“易语言利用百度空间检测版本更新源码”这个主题中,我们将探讨如何使用易语言来实现一个自动检测并提示用户进行版本更新的功能,以及涉及到的网络通信技术和数据解析。 首先,我们需要理解的是版本更新检测的...
在Unity游戏开发中,版本控制和更新机制是至关重要的部分,确保玩家总是使用最新、最稳定的游戏版本。本文将深入探讨“Unity Md5更新版本值设置”这一主题,以及如何利用工具自动生成文件夹下的所有Md5值进行版本...
本文将深入探讨几种常用的目标检测算法,包括背景差分法和混合高斯模型背景建模。 首先,我们来理解背景差分法。这是一种基于静态背景的动态目标检测方法。在监控场景中,背景通常是相对静止的,而目标则是移动的。...
一是解决音频问题,例如无声、杂音、音量不均等,检测声卡可以快速定位问题所在,从而针对性地更新驱动或者更换硬件。二是优化音质,不同的声卡可能适合不同类型的音频应用,如游戏、音乐制作或电影观看,检测声卡有...
3. 如果找到新版本,提示用户有可用更新,并开始下载新版本的`.exe`。 4. 下载完成后,可以提供一个选项让用户立即安装或选择稍后安装。 5. 用户选择安装时,执行`.exe`文件,完成升级过程。 总的来说,这个实例...