Android应用检查更新下载安装打开

一、效果

低版本1.02

Android应用检查更新下载安装打开_第1张图片

检测到新版本1.03

Android应用检查更新下载安装打开_第2张图片

调用android的安装activity页面

Android应用检查更新下载安装打开_第3张图片


安装完成

Android应用检查更新下载安装打开_第4张图片


打开

1.03版本

Android应用检查更新下载安装打开_第5张图片

二、注意

必须使用签名的应用。因为android不管是虚拟机还是真机安装应用都需要签名。

在开发时,我们运行程序时,开发环境ADT会自动给我们加入一个默认的开发签名,所以我们不需要手动导出签名应用。

三、步骤

1、编写更新文件update.json

2、编写更新代码

3、导出低版本签名应用(1.02)

4、adb命令安装低版本签名应用

5、导出高版本签名应用(1.03),放到tomcat服务器上

6、自动更新安装升级

四、各步骤详情

4.1编写更新文件update.json

{
"versonName":"1.03",
"versonCode":3,
"description":"新增了很多功能,更新体验吧!",
"downloadUrl":"http://10.0.2.2:8080/android/ZMGMobileSafe1.03.apk"
}

4.2编写更新代码

检查更新的功能
/**
	 *检查是否有新的版本
	 */
	private void checkNewVersion(){
		
		new Thread(){

			public void run() {
				long startTime=System.currentTimeMillis();
				//Android推荐使用,这个方法会先检测是否存在message实例,如果存在直接用,如果没有存在则new一个。
				//Android系统默认有10个实例
				Message msg=Message.obtain();
				String url="http://10.0.2.2:8080/android/update.json";
				try {
					//访问服务器获取json
					String result=HttpConnectionUtils.get(url);
					//解析json字符串
					JSONObject js=new JSONObject(result);
					mVersonName = js.getString("versonName");
					mVersonCode = js.getInt("versonCode");
					mDescription = js.getString("description");
					mDownloadUrl = js.getString("downloadUrl");
					
					//比较服务器版本号和应用的版本号
					if(mVersonCode>getVersionCode()){
						msg.what=CODE_UPDATE_DIALOG;
					}else{
						msg.what =CODE_ENTER_HOME;
					}
					
				} catch (MalformedURLException e) {
					//url格式错误
					msg.what=CODE_URL_ERROR;
					e.printStackTrace();
				} catch (IOException e) {
					//网络异常
					msg.what=CODE_NET_ERROR;
					e.printStackTrace();
				}catch (JSONException e) {
					//json格式错误
					msg.what=CODE_JSON_ERROR;
					e.printStackTrace();
					
				}finally{
					//不能让闪屏页太快闪过去,强制等待
					long endTime=System.currentTimeMillis();
					long usedTime=endTime-startTime;
					if(usedTime<3000){
						try {
							Thread.sleep(3000-usedTime);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					
					mHandler.sendMessage(msg);
				}
				
			}
		}.start();
	}

HttpConnectionUtils.java
/**
	 * http-get的方式获取数据
	 * @param url 访问地址
	 * @return 字符串
	 * @throws MalformedURLException 
	 */
	public static String get(String url) throws MalformedURLException,IOException{
		
		String result="";
		//MalformedURLException 不正确的url地址异常
		URL connUrl=new URL(url);
		HttpURLConnection conn=(HttpURLConnection) connUrl.openConnection();
		conn.setRequestMethod("GET");
		conn.setConnectTimeout(5000);//设置连接超时,如果5秒连不上,就不连接了,抛IOException
		conn.setReadTimeout(5000);//设置读取超时,虽然连接上了,但是服务器5秒了还不给反应,也就不等了,抛IOException
		conn.connect();
		
		int responseCode=conn.getResponseCode();
		if(responseCode==HttpURLConnection.HTTP_OK){
			//读取响应头里的输入流
			InputStream ins=conn.getInputStream();
			result=StreamUtils.readFromStream(ins);
		}
		
		if(conn!=null){
			conn.disconnect();
		}
		
		return result;
	}

private void ShowUpdateDialog(){
		AlertDialog.Builder builder=new AlertDialog.Builder(this);
		builder.setTitle(getText(R.string.updateTitle)+mVersonName);
		builder.setMessage(mDescription);
		//设置当点击退回键的时候,对话框不关闭
		builder.setCancelable(false);
		//设置确定按钮的点击事件
		builder.setPositiveButton("立即升级", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				System.out.println("点击了立即升级");
				downLoad();
			}
		});
		
		builder.setNegativeButton("以后再说", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				enterHome();
			}
		});
		
		//用户点击返回键时触发,点击了返回键则进入主界面
		builder.setOnCancelListener(new OnCancelListener() {
			@Override
			public void onCancel(DialogInterface dialog) {
				enterHome();
			}
		});
		
		//这句话不能忘记哦,是把对话框显示出来
		builder.show();
	}


代码中用到了xUtils框架的httpUtils模块下载功能
private void downLoad() {
		//检查SD卡是否准备好了
		if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
			tvProgress.setVisibility(View.VISIBLE);//显示进度条
			String target=Environment.getExternalStorageDirectory()+"/safeUpdate.apk";
			//xUtils
			HttpUtils utils=new HttpUtils();
			utils.download(mDownloadUrl, target, new RequestCallBack<File>() {
				@Override
				public void onLoading(long total, long current,
						boolean isUploading) {
					super.onLoading(total, current, isUploading);
					
					tvProgress.setText("下载进度:"+current/total*100+"%");
				}
				
				@Override
				public void onSuccess(ResponseInfo<File> responseInfo) {
					/*
					 * 调用系统的安装activity
					<activity android:name=".PackageInstallerActivity"
			                android:configChanges="orientation|keyboardHidden"
			                android:theme="@style/Theme.Transparent">
			            <intent-filter>
			                <action android:name="android.intent.action.VIEW" />
			                <category android:name="android.intent.category.DEFAULT" />
			                <data android:scheme="content" />
			                <data android:scheme="file" />
			                <data android:mimeType="application/vnd.android.package-archive" />
			            </intent-filter>
			        </activity>
					 */
					Intent intent=new Intent();
					intent.setAction(Intent.ACTION_VIEW);
					intent.addCategory(Intent.CATEGORY_DEFAULT);
					intent.setDataAndType(Uri.fromFile(responseInfo.result), "application/vnd.android.package-archive");
					//startActivity(intent);
					//当用户点击了取消安装,会返回结果,回调方法onActivityResult
					startActivityForResult(intent, 0);
					//安装完成后,提示完成、打开
					android.os.Process.killProcess(android.os.Process.myPid());
				}
				
				@Override
				public void onFailure(HttpException error, String msg) {
					Toast.makeText(SplashActivity.this, "下载失败!", Toast.LENGTH_SHORT).show();
				}
			});
			
		}else{
			Toast.makeText(this, "没有找到SD卡", Toast.LENGTH_SHORT).show();
		}
	}

下载完成了安装时,调用android系统的activity页面,会显示安装页面,有取消和安装两个按钮。
/*
					 * 调用系统的安装activity
					<activity android:name=".PackageInstallerActivity"
			                android:configChanges="orientation|keyboardHidden"
			                android:theme="@style/Theme.Transparent">
			            <intent-filter>
			                <action android:name="android.intent.action.VIEW" />
			                <category android:name="android.intent.category.DEFAULT" />
			                <data android:scheme="content" />
			                <data android:scheme="file" />
			                <data android:mimeType="application/vnd.android.package-archive" />
			            </intent-filter>
			        </activity>
					 */
					Intent intent=new Intent();
					intent.setAction(Intent.ACTION_VIEW);
					intent.addCategory(Intent.CATEGORY_DEFAULT);
					intent.setDataAndType(Uri.fromFile(responseInfo.result), "application/vnd.android.package-archive");
					//startActivity(intent);
					//当用户点击了取消安装,会返回结果,回调方法onActivityResult
					startActivityForResult(intent, 0);
					//安装完成后,提示完成、打开
					android.os.Process.killProcess(android.os.Process.myPid());

4.3,4 导出签名应用

修改AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zengmg.MobileSafe"
    android:versionCode="2"
    android:versionName="1.02">

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zengmg.MobileSafe"
    android:versionCode="3"
    android:versionName="1.03">


具体导出步骤见博文:http://blog.csdn.net/zengmingen/article/details/49761469

4.6 安装

如果报错可能是签名不一致问题

见博文:http://blog.csdn.net/zengmingen/article/details/49760359


你可能感兴趣的:(Android应用检查更新下载安装打开)