您的位置:首页 > 移动开发 > Android开发

android的apk自动检测升级

2014-08-09 11:53 357 查看
首先获取本地apk版本:

/**
* 获取本地软件版本
*/
public static int getLocalVersion(Context ctx){
int localVersion = 0;
try {  

            PackageInfo packageInfo = ctx.getApplicationContext()  

                    .getPackageManager().getPackageInfo(ctx.getPackageName(), 0);  

            localVersion = packageInfo.versionCode;  

           Log.d("TAG", "本软件的版本。。"+localVersion);

        } catch (NameNotFoundException e) {  

            e.printStackTrace();  

        }  
return localVersion;
}

然后获取服务器版本,这个可以通过很多方式获取就自己发挥

获取服务器版本后跟本地apk版本进行比较:

如果低于服务器版本就进行更新:(本人写的仅供参考,我是异步下载的,然后通知的方式显示进度)

/**
* 用于更新app版本
*
* @param ctx
* 上下文对象
* @param url
* 更新版本的地址
*/
private static PendingIntent pendingIntent;

public static void UpdateVersion(final Context ctx, String url) {
createNotification(ctx);
// 创建文件,读取app_name
createFile(ctx.getResources().getString(R.string.app_name));
new AsyncTask<String, Void, String>() {
@Override
protected String doInBackground(String... params) {
int down_step = 1;// 提示step
int totalSize;// 文件总大小
int downloadCount = 0;// 已经下载好的大小
int updateCount = 0;// 已经上传的文件大小
InputStream inputStream;
OutputStream outputStream;

URL url;
HttpURLConnection httpURLConnection = null;
try {
url = new URL(params[0]);
httpURLConnection = (HttpURLConnection) url
.openConnection();
httpURLConnection.setConnectTimeout(TIMEOUT);
httpURLConnection.setReadTimeout(TIMEOUT);
// 获取下载文件的size
totalSize = httpURLConnection.getContentLength();
// Log.d("TAG", "totalSize"+totalSize);
if (httpURLConnection.getResponseCode() == 404) {
throw new Exception("fail!");
}
inputStream = httpURLConnection.getInputStream();
// File appFile=File.createTempFile("中拓钢铁",".apk");
outputStream = new FileOutputStream(updateFile, false);// 文件存在则覆盖掉
byte buffer[] = new byte[1024];
int readsize = 0;
while ((readsize = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, readsize);
downloadCount += readsize;// 时时获取下载到的大小
// Log.d("TAG", "downloadCount"+downloadCount);
/**
* 每次增张1%
*/
if (updateCount == 0
|| (downloadCount * 100 / totalSize - down_step) >= updateCount) {
updateCount += down_step;
// 改变通知栏
// Log.d("TAG", "开始下载。。");
builder = new Notification.Builder(ctx)
.setSmallIcon(R.drawable.logo)
.setContentText(
"正在下载(" + updateCount + "%)...")
.setProgress(100, updateCount, false);
manager.notify(8, builder.build());
}

}
if (httpURLConnection != null) {
httpURLConnection.disconnect();
}
inputStream.close();
outputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}

return null;
}

@Override
protected void onPostExecute(String result) {
// 下载完成,点击安装
System.out.println("updateFile.." + updateFile);
Uri uri = Uri.fromFile(updateFile);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri,
"application/vnd.android.package-archive");

pendingIntent = PendingIntent.getActivity(ctx, 0, intent, 0);
builder = new Notification.Builder(ctx)
.setSmallIcon(R.drawable.logo)
.setContentIntent(pendingIntent)
.setContentTitle("apk下载更新")
.setContentText("下载成功,请点击安装")
.setProgress(100, 100, false);
manager.notify(8, builder.build());

}
}.execute(url);

}

private static void createNotification(Context ctx) {

// 最普通的通知栏
manager = (NotificationManager) ctx
.getSystemService(ctx.NOTIFICATION_SERVICE);
builder = new Notification.Builder(ctx).setSmallIcon(R.drawable.logo)
.setContentTitle("apk下载更新").setContentText("准备下载...")
.setProgress(100, 0, false);
manager.notify(8, builder.build());
}
当下载完成后,可以点击安装。

注:当你的apk是签名后的,如果手机上面的apk是没有签名的,那么在安装时会提示签名不同的包冲突,无法安装,这样只能卸载没有签名的apk后再安装
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息