在闪屏中处理升级。
加入两项权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
style.xml中加入以下代码,去掉标题栏
<!-- Application theme. --> <style name="AppTheme" parent="AppBaseTheme"> <!-- All customizations that are NOT specific to a particular API-level can go here. --> <item name="android:windowNoTitle">true</item> </style>
SplashActivity:
package com.mhm.mySport; import java.io.File; import org.apache.http.Header; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.lidroid.xutils.HttpUtils; import com.lidroid.xutils.exception.HttpException; import com.lidroid.xutils.http.ResponseInfo; import com.lidroid.xutils.http.callback.RequestCallBack; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.JsonHttpResponseHandler; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.TextView; import android.widget.Toast; public class SplashActivity extends Activity { TextView tv_version; TextView tv_progress; String server_v_name; int server_v_code; String server_v_url; String server_v_text; @SuppressLint("HandlerLeak") Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { if(msg.what == 1) { // 可升级 uploadDailog(); } else if(msg.what == 2) { // Toast.makeText(SplashActivity.this, "当前已是最新版本", Toast.LENGTH_SHORT).show(); enterHome(); } else { Toast.makeText(SplashActivity.this, "升级时遇到故障", Toast.LENGTH_SHORT).show(); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); tv_version = (TextView) findViewById(R.id.tv_version); tv_version.setText("版本号:" + getLocalVersionName()); tv_progress= (TextView) findViewById(R.id.tv_progress); checkVersion(); } private void download() { // 判断是否有SD卡且SD卡挂载 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { tv_progress.setVisibility(View.VISIBLE); String target = Environment.getExternalStorageDirectory() + "/update.apk"; HttpUtils hu = new HttpUtils(); hu.download(server_v_url, target, new RequestCallBack<File>() { @Override public void onLoading(long total, long current, boolean isUploading) { super.onLoading(total, current, isUploading); tv_progress.setText("下载进度:" + current / total * 100 + "%"); } @Override public void onSuccess(ResponseInfo<File> arg0) { //打开安装界面 Intent intent = new Intent(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setDataAndType(Uri.fromFile(arg0.result), "application/vnd.android.package-archive"); // 4.0及后续版本,需加此行代码,否则安装完后不进入APP界面 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } @Override public void onFailure(HttpException arg0, String arg1) { Toast.makeText(SplashActivity.this, "下载失败", Toast.LENGTH_SHORT).show(); } }); } else { Toast.makeText(SplashActivity.this, "没有SD卡", Toast.LENGTH_SHORT).show(); } } /** * 弹出是否更新对话框 */ private void uploadDailog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("最新版本:" + server_v_name); builder.setMessage(server_v_text); // 不升级不能使用该软件,尽量不用 // builder.setCancelable(false); builder.setPositiveButton("立即更新", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { download(); } }); builder.setNegativeButton("以后再说", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { enterHome(); } }); builder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { enterHome(); } }); builder.show(); } private void enterHome() { Intent intent = new Intent(this, HomeActivity.class); startActivity(intent); finish(); } private String getLocalVersionName() { PackageManager packageManager = getPackageManager(); String versionName = "1.0"; //int versionCode = 1; try { PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0); versionName = packageInfo.versionName; //versionCode = packageInfo.versionCode; } catch (NameNotFoundException e) { e.printStackTrace(); } return versionName; } private int getLocalVersionCode() { PackageManager packageManager = getPackageManager(); int versionCode = 1; try { PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0); versionCode = packageInfo.versionCode; } catch (NameNotFoundException e) { e.printStackTrace(); } return versionCode; } private void checkVersion() { AsyncHttpClient client = new AsyncHttpClient(); String url = "http://58.216.180.114:7074/upload.json"; client.get(url, new JsonHttpResponseHandler(){ @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { super.onSuccess(statusCode, headers, response); if (statusCode == 200) { //遍历json数组 try { // 获取具体的一个JSONObject对象 JSONObject obj = response; server_v_name = obj.getString("versionName"); server_v_code = obj.getInt("versionCode"); server_v_text = obj.getString("versionText"); server_v_url = obj.getString("url"); Message msg = new Message(); if(getLocalVersionCode() < server_v_code) { msg.what = 1; } else { msg.what = 2; } handler.sendMessage(msg); } catch (JSONException e) { e.printStackTrace(); } } } @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { super.onFailure(statusCode, headers, responseString, throwable); System.out.println("1"); } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) { super.onFailure(statusCode, headers, throwable, errorResponse); System.out.println("2"); } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { super.onFailure(statusCode, headers, throwable, errorResponse); Message msg = new Message(); msg.what = 0; handler.sendMessage(msg); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { enterHome(); super.onActivityResult(requestCode, resultCode, data); } }
相关推荐
在Android系统中,APK(Android Package)是应用程序的基本打包格式,它包含了应用程序的所有组件,如代码、资源、图标和元数据。当我们提到"android 系统升级apk"时,通常指的是更新现有设备上的应用程序或操作系统...
APK是Android应用程序的包文件格式,包含应用的代码、资源、证书和清单文件等。当开发者发布新版本时,会生成一个新的APK文件,用户需要下载并安装这个新版本来获取更新。 **2. 版本控制** 在在线升级过程中,应用...
在 AndroidManifest.xml 文件中添加 android:sharedUserId="android.uid.system",这样可以使 APK 的权限升级到 system 级别。同时,还需要在对应的 Android.mk 文件中添加 LOCAL_CERTIFICATE := platform。这一方法...
在提供的`testUpdate`文件中,可能包含了实现上述功能的源代码,包括服务类、网络请求类、对话框提示类、下载管理类等,通过分析这些代码,开发者可以更好地理解并实现在自己的项目中应用自动版本升级功能。
APK文件包含所有必要的代码、资源和元数据,使得用户可以在Android设备上安装和运行应用程序。然而,有时候开发者或安全研究人员需要深入理解APK的内部结构,以进行调试、逆向工程或安全分析,这就需要用到“Android...
本示例将向您展示如何在代码层面实现Android App的升级功能,这将帮助开发者更方便地集成到自己的项目中。提供的资源包括一个GitHub上的开源库`CheckVersionLib`以及一个自编写的实现,两者都是为了实现检查并提示...
1. 数据安全:备份APK可以防止因手机丢失、刷机或系统升级导致的应用数据丢失。 2. 分享应用:提取APK可以让其他用户安装同一应用,尤其对于未在Google Play或其他官方商店上架的应用。 3. 修改应用:开发者可能需要...
1.实现了应用级的未捕获异常处理,方便应用异常退出的错误定位,该功能可方便地进行重用;...4.检测升级部分的代码是在博客http://blog.csdn.net/hello2me/article/details/8635091 基础上修改而来,在此声明.
7. **权限管理**:在Android 6.0及以上版本,需要动态申请`WRITE_EXTERNAL_STORAGE`权限,以便将APK文件保存到外部存储。 8. **用户体验**:在实现强制更新时,尽量避免影响用户正常使用应用,比如在后台进行检查...
综上所述,Android升级包和APK的签名是发布流程中的关键步骤,涉及到应用的可信任性、版本控制和代码安全。`sign64.exe`和`sign32.exe`工具提供了对APK签名的便捷支持,确保了应用的正确发布和更新。
最近在搞 Android A/B 分区 OTA 升级,开始以为挺简单的一个事,没想到折腾了几天,还好终于搞定!代码调用其实就那么点,但是参数以及权限之类很关键,搬砖过来走不通,我就是卡了2天,一些莫名的错误,没法定位。...
Android APK 反编译是移动应用开发者和安全研究人员常用的技术,用于查看、分析或修改APK文件中的源代码、资源和配置。APK是Android应用程序的打包格式,它包含了应用程序的所有组件,包括Java字节码、资源文件、...
2. **构建和优化APK**:开发者使用Android Studio或其他构建工具(如Gradle)将源代码编译成APK,同时进行资源压缩和代码混淆等优化操作。 3. **签名APK**:使用如 jarsigner 命令行工具或者专门的签名工具(例如本...
"android在线升级实现源码"是一个专门用于展示如何在Android应用程序中实现带有进度条的APK在线升级功能的示例代码。这个源码项目名为"ApkLoadDemo",提供了完整的流程和逻辑,供开发者参考学习。 首先,我们需要...
本文将详细讲解如何在Android 7.0设备上下载并安装APK应用,以及在这个版本中与APK安装相关的知识点。 1. **APK 文件**:APK 是 Android 应用程序的安装包,类似于 Windows 上的 .exe 文件。它包含了应用的代码、...
本文将详细探讨如何在Android应用程序中实现自动检查并下载新版本的代码逻辑,以达到无缝更新的效果。 首先,我们需要一个服务(Service)来执行后台的更新检查。这个服务会在合适的时机(例如应用启动时或网络连接...
网上找了一堆Delphi安卓APP程序自动升级方法都大多不太好用,有的需要配置WEB服务器,有的控制下载和升级管理麻烦,于是综合网上资料,根据项目需要整理了一个代码单元,可以直接调用,测试环境Delphi XE 10.3
这里主要讨论的是针对Android系统的远程升级,因为提到了"apk文件",这是Android应用程序的包文件格式。 首先,我们要理解远程升级(OTA,Over-the-Air)的基本原理。它利用HTTP或HTTPS协议,将更新的apk文件从...
在Android系统中,增量升级是一种优化更新过程的技术,它允许用户仅下载和安装自上次更新以来发生更改的部分代码,而不是整个应用或系统。这大大减少了数据使用和更新时间,提高了用户体验。本文将深入探讨Android...
同时,由于Android应用的保护措施不断升级,某些APK可能包含混淆代码或加密资源,使得反编译过程更为复杂。 总的来说,这些工具和文档提供了一个完整的Android APK反编译解决方案,对于开发者而言,它们是理解和...