Phonegap 安卓的自动升级与更新。当版本为4.0的时候

清单文件中:

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14"/>
View Code

js文件:

[{"verName":"xinjiangQJ","verCode":2}]
View Code

主窗口MainActivity中的代码:

package fx.qj.cn;



import android.os.Bundle;





import android.view.KeyEvent;

import android.view.Menu; 

import android.view.MenuItem;

import android.view.Window;

import android.widget.Toast;



import java.io.BufferedReader;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;



import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import android.app.AlertDialog;

import android.app.Dialog;

import android.app.ProgressDialog;

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.util.Log;

import org.apache.cordova.*;







public class MainActivity extends DroidGap {

     private long exitTime = 0;

    //自动检查更新开始

        private String localApkName = "XJQJW。apk";//存在于本地的apk名字

        private String packageName = "fx.qj.cn";//本应用包名,用于获取本地版本号

        private int serverVersion = 0;//服务端版本号

        private int localVersion = 0;//本地版本号

        private ProgressDialog pBar = null;//“正在下载”对话框

        

    @Override

    public void onCreate(Bundle savedInstanceState) {

         requestWindowFeature(Window.FEATURE_NO_TITLE);

          super.onCreate(savedInstanceState);

          super.init();

          android.webkit.WebSettings settings = super.appView.getSettings();

          String appCachePath = this.getCacheDir().getAbsolutePath();

          settings.setAppCachePath(appCachePath);

          settings.setAllowFileAccess(true);

          settings.setAppCacheEnabled(true);

          super.setIntegerProperty("splashscreen",R.drawable.startup_bg1);

          super.loadUrl("file:///android_asset/www/index.html",5000);

          checkUpdate();//自动检查更新

    }

    

    //双击退出

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.main, menu);

        return true;

    }

    @Override

    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK) {

            exit();

            return false;

        }

        return super.onKeyDown(keyCode, event);

    }



    public void exit() {

        if ((System.currentTimeMillis() - exitTime) > 2000) {

            Toast.makeText(getApplicationContext(), "再按一次退出程序",

                    Toast.LENGTH_SHORT).show();

            exitTime = System.currentTimeMillis();

        } else {

            finish();

            System.exit(0);

        }

    }

    

    //自动更新

    private void checkUpdate() {

        localVersion = getLocalVersion();

        new Thread() {



            @Override

            public void run() {

                // TODO Auto-generated method stub

                super.run();

                URL url_2;

                String str = "";

                int apkVersion = 0;

                String apkPath = "";

                try {

                    String path=getResources().getString(R.string.url_server); 

                    url_2 = new URL(path);

                    HttpURLConnection conn = (HttpURLConnection) url_2

                            .openConnection();

                    conn.setConnectTimeout(5000);

                    InputStream is = conn.getInputStream();

                    byte[] json = new byte[1024];

                    is.read(json);

                    str = new String(json, "utf-8");

                    JSONArray array = new JSONArray(str);

                    JSONObject item = array.getJSONObject(0);

                    apkVersion = item.getInt("verCode");

                    String apkpath=getResources().getString(R.string.url_server); 

                    apkPath = apkpath;

                } catch (MalformedURLException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                } catch (IOException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                } catch (JSONException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }



                Bundle data = new Bundle();

                data.putInt("apkVersion", apkVersion);

                data.putString("apkPath", apkPath);

                Message msg = new Message();

                msg.what = 1;

                msg.setData(data);

                hander.sendMessage(msg);

            }



        }.start();

    }

    

    private int getLocalVersion(){

        int version=-1;

        try {

            version = this.getPackageManager().getPackageInfo(packageName, 0).versionCode;

        } catch (NameNotFoundException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

            Log.e("TAG",e.getMessage());

        }

        return version;

    }

    

    

    

    private Handler hander = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            super.handleMessage(msg);

            switch (msg.what) {

            case 1:

                Bundle b = msg.getData();

                serverVersion = b.getInt("apkVersion");

                final String apkPath = b.getString("apkPath");

                Log.v("apkVersion", serverVersion+"");

                if(localVersion<serverVersion){

                    AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);

                alert.setTitle("软件更新").setMessage("发现新版本,建议立即更新使用.").setPositiveButton("更新", new DialogInterface.OnClickListener() {



                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        // 确定更新

                        pBar = new ProgressDialog(MainActivity.this);

                        pBar.setTitle("正在下载");

                        pBar.setMessage("请稍后。。。");

                        pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);

                        String apkpath=getResources().getString(R.string.url_apk); 

                        downFile(apkpath);

                    }

                }).setNegativeButton("取消", new DialogInterface.OnClickListener() {



                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        dialog.dismiss();

                    }

                });

                alert.create().show();

                }

                break;

            }

        }

    };

    

    public void downFile(final String url){

        pBar.show();

        new Thread(){

            public void run(){

                HttpClient client = new DefaultHttpClient();

                HttpGet get = new HttpGet(url);

                HttpResponse response;

                System.out.println(url);

                try {

                    response = client.execute(get);

                    HttpEntity entity = response.getEntity();

                    long length = entity.getContentLength();

                    InputStream is =  entity.getContent();

                    FileOutputStream fileOutputStream = null;

                    if(is != null){

                        File file = new File(Environment.getExternalStorageDirectory(),localApkName);

                        fileOutputStream = new FileOutputStream(file);

                        byte[] b = new byte[1024];

                        int charb = -1;

                        int count = 0;

                        while((charb = is.read(b))!=-1){

                            fileOutputStream.write(b, 0, charb);

                            count += charb;

                        }

                    }

                    fileOutputStream.flush();

                    if(fileOutputStream!=null){

                        fileOutputStream.close();

                    }

                    down();

                }  catch (Exception e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

        }.start();

    }

    

    

    

    Handler handler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            super.handleMessage(msg);   

            pBar.cancel();

            update();

        }

    };

    

    public void down(){

        new Thread(){

            public void run(){

                Message message = handler.obtainMessage();

                handler.sendMessage(message);

            }

        }.start();

    }

    

    public void update(){

        Intent intent = new Intent(Intent.ACTION_VIEW);

        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory(),localApkName))

                , "application/vnd.android.package-archive");

        startActivity(intent);

    }

}
View Code

把http请求【HttpURLConnection conn = (HttpURLConnection) url_2.openConnection();】放到了主线程中来运行,

报错android.os.NetworkOnMainThreadException

直接翻译就是:网络工作在主线程中的异常;网上一查发现是android中规定网络请求等耗时操作是不允许在主线程中出现的,需要另起线程,线程若有数据需要与主线程交互就可以用handler来接收。

 

参考资料连接: http://my.eoe.cn/1222037/archive/21064.html

你可能感兴趣的:(PhoneGap)