Androidmainfest.xml. Configure related permissions
<?XML version= "1.0" encoding= "Utf-8"?><Manifestxmlns:android= "Http://schemas.android.com/apk/res/android" Package= "Com.mytest.versionupdate"Android:versioncode= "1"Android:versionname= "1.0" > <USES-SDKandroid:minsdkversion= "+"android:targetsdkversion= "+" /> <uses-permissionAndroid:name= "Android.permission.INTERNET"/> <uses-permissionAndroid:name= "Android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permissionAndroid:name= "Android.permission.WRITE_EXTERNAL_STORAGE"/> <ApplicationAndroid:allowbackup= "true"Android:icon= "@drawable/ic_launcher"Android:label= "@string/app_name"Android:theme= "@style/apptheme" > <ActivityAndroid:name=". Mainactivity "Android:label= "@string/app_name" > <Intent-filter> <ActionAndroid:name= "Android.intent.action.MAIN" /> <categoryAndroid:name= "Android.intent.category.LAUNCHER" /> </Intent-filter> </Activity> </Application></Manifest>
View Code
Main.xml,
<Relativelayoutxmlns:android= "Http://schemas.android.com/apk/res/android"Xmlns:tools= "Http://schemas.android.com/tools"Android:layout_width= "Match_parent"Android:layout_height= "Match_parent"Tools:context= "Com.mytest.autoupdate.MainActivity" > <TextViewAndroid:layout_width= "Wrap_content"Android:layout_height= "Wrap_content"Android:text= "@string/hello_world" /></Relativelayout>
View Code
Downloadapk_progress.xml, customizing Download Progress view
<LinearLayoutxmlns:android= "Http://schemas.android.com/apk/res/android"Xmlns:tools= "Http://schemas.android.com/tools"Android:layout_width= "Match_parent"Android:layout_height= "Match_parent"Tools:context= "Com.mytest.autoupdate.MainActivity" > <ProgressBarAndroid:id= "@+id/download_progressbar"Android:layout_width= "Fill_parent"Android:layout_height= "Wrap_content"style= "? Android:attr/progressbarstylehorizontal" /></LinearLayout>
View Code
Call Automatic Updates in Mainactivity.java
Package Com.mytest.autoupdate;import Android.app.activity;import Android.os.bundle;import android.view.Menu;import Android.view.menuitem;public class Mainactivity extends Activity { @Override protected void OnCreate (Bundle Savedinstancestate) { super.oncreate (savedinstancestate); Setcontentview (r.layout.activity_main); New Autoupdatemanager (this). Checkisneedupdate (); }}
View Code
Autoupdatemanager.java
Package Com.mytest.autoupdate;import Java.io.file;import Java.io.fileoutputstream;import java.io.IOException; Import Java.io.inputstream;import Java.net.httpurlconnection;import Java.net.malformedurlexception;import Java.net.url;import Org.json.jsonexception;import Org.json.jsonobject;import Org.json.jsontokener;import Android.app.alertdialog;import Android.app.alertdialog.builder;import Android.app.dialog;import Android.content.context;import Android.content.dialoginterface;import Android.content.intent;import Android.content.pm.packagemanager.namenotfoundexception;import Android.net.uri;import android.os.Environment; Import Android.os.handler;import Android.os.message;import Android.text.alteredcharsequence;import Android.util.log;import Android.view.layoutinflater;import Android.view.view;import Android.widget.ProgressBar; Import Android.widget.toast;public class Autoupdatemanager {private final String Log_tag = "Autoupdatemanager"; Private context context; Public AutoupdatemAnager (Context context) {This.context = context; }//Judge version update URL private final String Check_version__url = "Http://192.168.23.1:8080/testapp/version_json"; /** * Check if you need to update */public void Checkisneedupdate () {//Get version Information new Thread (new Runnable () { @Override public void Run () {//Get version information String Versionjson = GetVersionInfo () ; if (Versionjson! = NULL &&! "". Equals (Versionjson.trim ())) {Message msg = Versioninfohandler.obtainmessage (); Msg.obj = Versionjson; Versioninfohandler.sendmessage (msg); }}). Start (); Compare version if (!islastversion ()) {new Alertdialog.builder (context). Settitle ("hint"). Setmessage ("The software has an update, whether to download the update ? "). Setpositivebutton (" Update Now ", new Dialoginterface.onclicklistener () {@Override PublIC void OnClick (Dialoginterface dialog, int which) {//Show download progress bar Show Downloaddialog (); Download apk file Downloadapkfile (); Install APK//Todo}}). Setnegativebutton ("Next time", NULL) . Create (). Show (); } else {Toast.maketext (context, "Already the latest version", Toast.length_short). Show (); }} private ProgressBar Download_progressbar; Private Alertdialog Downloaddialog; Private Boolean iscanceldownload = false; Private final int download_state_fininsh = 1; Private final int download_state_load = 0; private int downloadcurprogress; Private Handler Downloadhandler = new Handler () {public void Handlemessage (Message msg) {switch (msg.a RG1) {case DOWNLOAD_STATE_LOAD:download_progressbar.setProgress (downloadcurprogress); Break Case DOWNLOAD_STATE_FININSH:downLoadDialog.dismiss (); INSTALLAPK (); Break } } }; private void Showdownloaddialog () {downloaddialog = new Alertdialog.builder (context). Settitle ("in Download") . Setnegativebutton ("Cancel", new Dialoginterface.onclicklistener () {@Override public void OnClick (Dialoginterface dialog, int which) {iscanceldownload = true; }}). Create (); View view = Layoutinflater.from (context). Inflate (r.layout.downloadapk_progress, NULL); Downloaddialog.setview (view); Download_progressbar = (ProgressBar) View.findviewbyid (R.id.download_progressbar); Downloaddialog.show (); }/** * Download apk file */private void Downloadapkfile () {LOG.V (Log_tag, "downloadapkfile->" + Versiondo Wnloadurl); New Thread (New Runnable () {@Override public void run () {try {if (E Nvironment.getexternalstoragestate (). Equals (environment.media_mounted)) {String Dirpath = environm Ent.getexternalstoragedirectory () + "/"; Saveapkpath = Dirpath + "AutoUpdate"; File File = new file (Saveapkpath); if (file.exists () = = False) {File.mkdir (); } saveapkfilename = "version" + Versioncode; File Apkfile = new file (saveapkpath,saveapkfilename); FileOutputStream fos = new FileOutputStream (apkfile); HttpURLConnection conn = (httpurlconnection) new URL (Versiondownloadurl). OpenConnection (); int fileSize = Conn.getcontentlength (); InputStream is = Conn.getinputstream (); int len = 0; int count = 0; byte[] buff = new byte[1024]; while (!iscanceldownload) {len = Is.read (buff); Calculate current Progress Count + = len;//log.v (log_tag, "downloadcurprogress->" + "Count:" +count+ ", FileSize:" +filesize); downloadcurprogress = (int) ((float) count/filesize);//LOG.V (Log_tag, "Downloadcurpro Gress-> "+downloadcurprogress); Message msg = Downloadhandler.obtainmessage (); MSG.ARG1 = Download_state_load; Downloadhandler.sendmessage (msg); if (len<0) {Message MSG2= Downloadhandler.obtainmessage (); Msg2.arg1= Download_state_fininsh; //Note A new Message object must be sent Downloadhandler.sendmessage (MSG2); Break } fos.write (Buff, 0, Len); } is.close (); }} catch (Exception e) {//TODO auto-generated catch block e.prints Tacktrace (); }}). Start (); }/** * is the latest version * * @return */Private Boolean islastversion () {try {int curver = Context.getpackagemanager (). Getpackageinfo ("Com.mytest.autoupdate",0). Versioncode; if (Curver < Versioncode) {return true; }} catch (Namenotfoundexception e) {//TODO auto-generated catch block E.printstacktrace (); } return false; }//Version information. private int versioncode; Private String Versionname; Private String Versiondesc; Private String Versiondownloadurl; Private String Saveapkfilename; Private String saveapkpath;//apk save path private Handler Versioninfohandler= newHandler () {public void Handlemessage (Message msg) {String Versionjson= (String)Msg.obj; try {Jsontokener JT= newJsontokener (Versionjson); Jsonobject obj= (jsonobject)Jt.nextvalue (); Demo Data//{"Versioncode": 3, "Versionname": "TestApp", "desc": "added xx function", "Versiondownloadurl": "http://192.168 .23.1:8080/testapp/versionupdate.apk "} versionname= obj.getstring ("Versionname"); Versiondesc= obj.getstring ("Versiondesc"); Versiondownloadurl= obj.getstring ("Versiondownloadurl"); Versioncode= Obj.getint ("Versioncode"); log.v (Log_tag, Versionname + "," + Versioncode); } catch (Jsonexception e) {//TODO auto-generated catch block E.printstacktrace (); } }; }; /** * Get version information */private String GetVersionInfo () {StringBuffer Jsonrst= newStringBuffer (); try {HttpURLConnection conn= (httpurlconnection)new URL (Check_version__url). OpenConnection (); Conn.setrequestmethod ("GET"); InputStream is= Conn.getinputstream (); int Len= 0; byte[] Buffer= newbyte[1024]; while (Len= is.read (buffer))!=-1){jsonrst.append (new String (buffer, 0, Len, "UTF-8")); } is.close (); } catch (Exception e) {e.printstacktrace (); } return jsonrst.tostring (); }/** * Install APK */private void installapk () {File file= newFile (saveapkpath+ "/" +saveapkfilename); if (file.exists ()==false) { return; } Intent Intent= newIntent (); Uri URI= Uri.parse ("file://" +file.tostring ()); Intent.setdataandtype (URI, "application/vnd.android.package-archive"); Context.startactivity (Intent); }; }
View Code
Key points of knowledge:
1, handler and the use of the message;
2, the Use of custom dialog (in the download progress);
3. Download the file to SD.
4. Install apk file.
5, JSON network acquisition and parsing.
Android implements app version update case