Android的APK升级以及下载安装

其实要实现Android发布新版本的APK升级是一个简单的事情,只要你明白其中的道理和实现方法就能很快实现出来,废话不多说,下面我给大家简单介绍一下实现步骤:



1:要知道APK是否有升级更新就需要知道本地的app版本号,获取版本后很简单,简单几句代码:


下面就是写一个方法获取到版本号并把它返回

private int getLocalVersionCode() {
PackageManager pm = super.getPackageManager();
// cn.itcast.update
String packageName = super.getPackageName();
// 功能清单信息
PackageInfo info = null;
try {
info = pm.getPackageInfo(packageName,// 包名
0// 默认
);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 版本号
int code = info.versionCode;
return code;
}

获取到版本号之后接下来就是如何去检查APK是否有更新,要实现这一步需要在你的服务器写一个接口返回数据,注意:返回的数据需要包括你更新的版本号,每当进入程序就检测对比你本地获取到的版本号和服务器的版本号是否相同,如果不同就提示用户更新,如果相同就没提示;  (提示:每当你发布一个新版本后需要在服务器接口返回最新的版本号信息,每次更新也需要在你的工程项目build.gradle文件修改版本号,我用的是android studio改的是这个,eclipse开发的是AndroidManifest.xml文件)


实现更新的方法就我现在掌握的有两种,一种就是最简单的:当检测到有跟新提示是否更新点确定直接让他跳到浏览器去下载你最新版本apk的下载链接下载更新即可;



还有一种就是自己写一个文件下载,联网下载文件保存在本地



下面是一个联网下载APK文件的方法,使用的联网框架是AsyncHttpClient 如果没使用过的可以使用其他方法


private void downloadAPK() {


                 //APK的下载地址
String XZurl =“”;




final ProgressDialog dialog = new ProgressDialog(context);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setTitle("请稍后");
dialog.setMessage("拼命下载中.....");
dialog.setMax(100);
dialog.setProgress(0);
dialog.show();
final AsyncHttpClient client = new AsyncHttpClient();
final AsyncHttpResponseHandler responseHandler = new AsyncHttpResponseHandler() {
/**
* 访问成功
*/
@Override
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBody) {
File file = null;
try {
final ByteArrayInputStream bais = new ByteArrayInputStream(
responseBody);
final File dir = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
file = new File(dir, "wanlianhui.apk");
final FileOutputStream fos = new FileOutputStream(file);
final DataOutputStream dos = new DataOutputStream(fos);
final byte[] buffer = new byte[1024];
int len = -1;
while ((len = bais.read(buffer)) != -1) {
dos.write(buffer, 0, len);
}
final int size = dos.size();
dos.close();
fos.close();
bais.close();
if (size == responseBody.length) {
dialog.dismiss();
Toast.makeText(context, "下载完成", Toast.LENGTH_SHORT)
.show();

installApk(file);   //这个就是你下载完成调用安装APK文件的方法,就在下面

}
} catch (Exception e) {
e.printStackTrace();
}
}


/**
* 显示进度条
*/
@Override
public void onProgress(int bytesWritten, int totalSize) {
final int progress = (int) (bytesWritten * 1.0 / totalSize * 100);
dialog.setProgress(progress);
}
/**
* 访问失败
*/
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
dialog.dismiss();
try {
String resu = new String(responseBody, "utf-8");
System.out.println("失败:" + resu);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
                    BaseApp.getInstance().showToast("下载失败");
}
NextOne();
Toast.makeText(context, "下载失败", Toast.LENGTH_LONG).show();
}
};
client.get(XZurl, responseHandler);
}



apk文件安装的方法

// 安装APK文件
private void installApk(File file) {
final Intent intent = new Intent();
intent.setAction(Intent.ACTION_INSTALL_PACKAGE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
final MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
final String type = mimeTypeMap.getExtensionFromMimeType("apk");
intent.setDataAndType(Uri.fromFile(file), type);
startActivity(intent);
}



这样就能简单实现APK更新了,希望对大家有用   (需要注意的是,APK包名需要保持一致,并且更新的版本号需要比上一个版本号高,这样才能覆盖上一个版本

Android应用开发中,下载安装APK升级应用版本通常涉及几个步骤:下载APK文件安装APK文件以及确保新版本与Android 30的兼容性。以下是一个简化的过程和示例代码来说明如何实现这样的升级机制。 1. **下载APK文件**:首先,你需要从服务器下载新版本的APK文件。这通常通过网络请求来实现,比如使用OkHttp库下载文件。 ```java // 示例代码,用于从网络下载APK文件 OkHttpClient client = new OkHttpClient(); String url = "http://yourserver.com/yourapp.apk"; // 替换为实际的APK下载链接 Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理下载失败的情况 } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { // 下载成功,保存APK文件到应用的私有目录 File apkFile = new File(getFilesDir(), "update.apk"); try (FileOutputStream fos = new FileOutputStream(apkFile); InputStream is = response.body().byteStream()) { byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } } // 下载完成后,调用安装APK的方法 installApk(apkFile); } } }); ``` 2. **安装APK文件**:一旦APK文件下载并保存在设备上,你可以使用`Intent`和`Uri`来启动安装过程。注意,从Android N(7.0)开始,需要适配“FileProvider”来分享文件。 ```java // 示例代码,用于安装APK文件 private void installApk(File apkFile) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Uri apkUri = FileProvider.getUriForFile(this, getPackageName() + ".provider", apkFile); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); startActivity(intent); } else { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } } ``` 3. **适配Android 30**:为了确保新版本应用与Android 30的兼容性,你需要遵循新的权限模型、存储访问框架(Scoped Storage)以及隐私相关的更新。例如,更新你的应用以使用分区存储。 ```xml <!-- 在AndroidManifest.xml中添加属性以启用分区存储 --> <manifest ...> <application android:requestLegacyExternalStorage="true"> ... </application> </manifest> ``` 请注意,`requestLegacyExternalStorage`是一个过渡属性,用于在Android 10上请求完整的外部存储访问权限。对于Android 11及以上版本,你可能需要使用分区存储或者动态请求权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值