一、效果
低版本1.02
檢測到新版本1.03
調用android的安裝activity頁面
安裝完成
打開
1.03版本
二、注意
必須使用簽名的應用。因為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 {//訪問服務器獲取jsonString 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秒連不上,就不連接了,拋IOExceptionconn.setReadTimeout(5000);//設置讀取超時,雖然連接上了,但是服務器5秒了還不給反應,也就不等了,拋IOExceptionconn.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() {@Overridepublic void onClick(DialogInterface dialog, int which) {System.out.println("點擊了立即升級");downLoad();}});builder.setNegativeButton("以后再說", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {enterHome();}});//用戶點擊返回鍵時觸發,點擊了返回鍵則進入主界面builder.setOnCancelListener(new OnCancelListener() {@Overridepublic 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";//xUtilsHttpUtils utils=new HttpUtils();utils.download(mDownloadUrl, target, new RequestCallBack<File>() {@Overridepublic void onLoading(long total, long current,boolean isUploading) {super.onLoading(total, current, isUploading);tvProgress.setText("下載進度:"+current/total*100+"%");}@Overridepublic 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);//當用戶點擊了取消安裝,會返回結果,回調方法onActivityResultstartActivityForResult(intent, 0);//安裝完成后,提示完成、打開android.os.Process.killProcess(android.os.Process.myPid());}@Overridepublic void onFailure(HttpException error, String msg) {Toast.makeText(SplashActivity.this, "下載失敗!", Toast.LENGTH_SHORT).show();}});}else{Toast.makeText(this, "沒有找到SD卡", Toast.LENGTH_SHORT).show();}}
/** 調用系統的安裝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);//當用戶點擊了取消安裝,會返回結果,回調方法onActivityResultstartActivityForResult(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