通过url下载apk,比较下载文件大小,通过handler更新界面,达到显示下载进度的目的。操作网络需要在子线程中进行
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
result = downloadFileSize * 100 / fileSize;
text.setText(result + "%");
break;
case 1:
//下载完成
break;
default:
break;
}
}
};
// 下载APK
protected File downloadFile(String urlStr, int id) {
// 准备拼接新的文件名(保存在存储卡后的文件名)
newFilename = urlStr.substring(urlStr.lastIndexOf("/") + 1);
newFilename = downloadCache + "/" + newFilename;
File file = new File(newFilename);
// 如果目标文件已经存在,则删除。产生覆盖旧文件的效果
if (file.exists()) {
OpenFile(file);
// file.delete();
} else {
try {
// 构造URL
URL url = new URL(urlStr);
// 打开连接
URLConnection con = url.openConnection();
// 获得文件的长度
int contentLength = con.getContentLength();
System.out.println("长度 :" + contentLength);
// 输入流
InputStream is = con.getInputStream();
fileSize = con.getContentLength();// 根据响应获取文件大小
// 1K的数据缓冲
byte[] bs = new byte[1024];
downloadFileSize = 0;
// 输出的文件流
FileOutputStream os = new FileOutputStream(newFilename);
do {
int numread = is.read(bs);// 读取到的数据长度
if (numread == -1) {
break;
}
os.write(bs, 0, numread);
downloadFileSize += numread;
sendMsg(0);// 更新进度条
} while (true);
sendMsg(1);// 通知下载完成
os.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return file;
}
下载完成后,根据文件保存路径,获取apk包名,通过包名判断该apk是否安装,是否正在运行
// 检测是否安装apk
public boolean isAppInstalled(Context context, String packageName) {
final PackageManager packageManager = context.getPackageManager();
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
List<String> pName = new ArrayList<String>();
if (pinfo != null) {
for (int i = 0; i < pinfo.size(); i++) {
String pn = pinfo.get(i).packageName;
pName.add(pn);
}
}
return pName.contains(packageName);
}
// 获取下载的apk包名
private String getApkPackage(String apkpath) {
String packageName = null;
PackageManager pm = this.getPackageManager();
PackageInfo info = pm.getPackageArchiveInfo(apkpath,
PackageManager.GET_ACTIVITIES);
ApplicationInfo appInfo = null;
if (info != null) {
appInfo = info.applicationInfo;
packageName = appInfo.packageName;
return packageName;
}
return packageName;
}
//判断指定包名的进程是否运行
public static boolean isRunning(Context context,String packageName){
ActivityManager am = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
List<RunningAppProcessInfo> infos = am.getRunningAppProcesses();
for(RunningAppProcessInfo rapi : infos){
if(rapi.processName.equals(packageName))
return true;
}
return false;
}
程序中需要开启网络权限,以及sd卡权限
本文详细介绍了如何使用URL下载APK文件,并通过Handler更新界面显示下载进度。操作网络需要在子线程中进行。重点涵盖了下载文件大小比较、进度更新以及下载完成后的处理流程。
936

被折叠的 条评论
为什么被折叠?



