扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
如何在Android开发中中实现一个App更新功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
成都创新互联公司是一家集网站建设,越秀企业网站建设,越秀品牌网站建设,网站定制,越秀网站建设报价,网络营销,网络优化,越秀网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
开发环境:AndroidStudio2.1.2+gradle-2.10
部分代码:
public class UpdateVersionController { private Context context; //更新文件的实例 private AppUpdateInfo info; //当前版本号 private int versionCode; //提示用户更新的dialog private Dialog dialog; //下载进度条 private ProgressDialog pd; public static UpdateVersionController getInstance(Context context) { return new UpdateVersionController(context); } public UpdateVersionController(Context context) { this.context = context; } public void normalCheckUpdateInfo() { //获取版本号:这里的版本号在项目的build.gradle中是可以看到的,看复制过来的参数 /** defaultConfig { applicationId "com.zhh.test" minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" } */ versionCode = getVerCode(context);//等于19 checkVersionTask(); } public void forceCheckUpdateInfo() {//强制更新一般不用 versionCode = getVerCode(context);//等于19 info = new AppUpdateInfo(); info.setUrl("http://60.210.21.89/appdl.hicloud.com/dl/appdl/application/apk/dd/ddeabc7e64d64e4287340ffb89c592a8/com.hellotext.1309171635.apk?sign=baidu@baidu&wshc_tag=0&wsts_tag=58c7bde2&wsid_tag=7c5a47c8&wsiphost=ipdbm"); info.setVercode(2);//每次更新都靠它 info.setVername("2.0");//版本名字 info.setApkname("com.hellotext.1309171635.apk"); info.setAppname("Hello"); info.setForceUpp("yes"); info.setUppcontent("1. Hello啊哟更新了\n2. 英文的,界面很好看.\n3. 界面效果优化");//更新内容 updateApp(); } /** * 步骤一:获取版本信息 */ private void checkVersionTask() { //网络加载获取app新版版本信息 //这里不做请求直接赋值 info = new AppUpdateInfo(); info.setUrl("http://60.210.21.89/appdl.hicloud.com/dl/appdl/application/apk/dd/ddeabc7e64d64e4287340ffb89c592a8/"+ "com.hellotext.1309171635.apk?sign=baidu@baidu&wshc_tag=0&wsts_tag=58c7bde2&wsid_tag=7c5a47c8&wsiphost=ipdbm"); info.setVercode(2);//每次更新都靠它 info.setVername("2.0");//版本名字 info.setApkname("com.hellotext.1309171635.apk"); info.setAppname("Hello"); info.setForceUpp("no"); info.setUppcontent("1. Hello啊哟更新了\n2. 英文的,界面很好看.\n3. 界面效果优化");//更新内容 updateApp(); } private void updateApp() { if (null != info && info.getVercode() > versionCode) {//20>19可更新 showUpdataDialog(); } else { Toast.makeText(context, "已经是最新版本啦~", Toast.LENGTH_SHORT).show(); } } private Button cancelBtn; /** * 步骤二:弹出对话框提示用户更新 */ protected void showUpdataDialog() { dialog = new Dialog(context, android.R.style.Theme_Dialog); dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); dialog.setContentView(R.layout.activity_updater); dialog.setCanceledOnTouchOutside(false); dialog.setCancelable(false); ((TextView) dialog.findViewById(R.id.content)).setText(info.getUppcontent()); cancelBtn = (Button) dialog.findViewById(R.id.cancel); cancelBtn.setVisibility("yes".equals(info.getForceUpp()) ? View.GONE : View.VISIBLE); // 取消更新 cancelBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); // 确认更新 dialog.findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); downLoadApk(); } }); dialog.findViewById(R.id.market).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("market://details?id=Hello")); context.startActivity(intent); } }); dialog.show(); } /** * 步骤三:下载文件 */ private void downLoadApk() { // 进度条对话框 pd = new ProgressDialog(context); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setMessage("下载中..."); pd.setCanceledOnTouchOutside(false); pd.setCancelable(false); // 监听返回键--防止下载的时候点击返回 pd.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { Toast.makeText(context, "正在下载请稍后", Toast.LENGTH_SHORT).show(); return true; } else { return false; } } }); // Sdcard不可用 if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { Toast.makeText(context, "SD卡不可用~", Toast.LENGTH_SHORT).show(); } else { pd.show(); //下载的子线程 new Thread() { @Override public void run() { try { // 在子线程中下载APK文件 File file = getFileFromServer(info.getUrl(), pd); sleep(1000); // 安装APK文件 installApk(file); pd.dismiss(); // 结束掉进度条对话框 } catch (Exception e) { Toast.makeText(context, "文件下载失败了~", Toast.LENGTH_SHORT).show(); pd.dismiss(); e.printStackTrace(); } } }.start(); } } /** * 从服务器下载apk */ public File getFileFromServer(String path, ProgressDialog pd) throws Exception { // 如果相等的话表示当前的sdcard挂载在手机上并且是可用的 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); // 获取到文件的大小 pd.setMax(conn.getContentLength() / 1024); InputStream is = conn.getInputStream(); File file = new File(Environment.getExternalStorageDirectory().getPath() + "/blibao/merchant", "i_blibao_shop.apk"); //判断文件夹是否被创建 if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } FileOutputStream fos = new FileOutputStream(file); BufferedInputStream bis = new BufferedInputStream(is); byte[] buffer = new byte[1024]; int len; int total = 0; while ((len = bis.read(buffer)) != -1) { fos.write(buffer, 0, len); total += len; // 获取当前下载量 pd.setProgress(total / 1024); } fos.close(); bis.close(); is.close(); return file; } else { return null; } } /** * 安装apk */ protected void installApk(File file) { Intent intent = new Intent(); // 执行动作 intent.setAction(Intent.ACTION_VIEW); // 执行的数据类型 intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } /** * 获取版本名 */ public static String getVerName(Context context) { String verName = ""; try { // 获取packagemanager的实例 PackageManager packageManager = context.getPackageManager(); // getPackageName()是你当前类的包名,0代表是获取版本信息 PackageInfo packInfo = packageManager.getPackageInfo( context.getPackageName(), 0); verName = packInfo.versionName; } catch (Exception e) { e.printStackTrace(); } return verName; } /** * 获取版本号 */ public static int getVerCode(Context context) { int verCode = -1; try { // 获取packagemanager的实例 PackageManager packageManager = context.getPackageManager(); // getPackageName()是你当前类的包名,0代表是获取版本信息 PackageInfo packInfo = packageManager.getPackageInfo( context.getPackageName(), 0); verCode = packInfo.versionCode; } catch (Exception e) { e.printStackTrace(); } return verCode; } }
关于如何在Android开发中中实现一个App更新功能问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流