服务器端怎么写网页文件来实现 安卓软件自动更新

15838138481 发布于 2012/08/03 11:09
阅读 2K+
收藏 0

@红猎人 你好,想跟你请教个问题:

加载中
0
曾赛
曾赛

通常Android的更新都是在应用商店中更新,另一个较常用的方法就和你的一样,有自己的服务器。当进行更新操作时,连接到自己的服务上,拉取更新包,或者是通过服务器传回更新包下载地址,再调用系统软件来下载。

网页没有主动 PUSH 的机制,所以如果要更新,肯定是先中手机中发起连接,连接到服务器。通常有两个实现方式,定期自动连接到服务器,或用户点更新按钮连接到服务器。

用网页来做就是用HTTP协议,那么最好是当客户端连接上来时,传给它新版本号及Apk包下载地址。然后再由手机客户端来解析并做更新

大家有更好的方案的,请补充一下哈

0
1
15838138481
服务器 如何 传新版本号及Apk包下载地址,代码怎么写,具体点,谢谢了
0
1
15838138481
详细点把,具体服务器端怎么设置啊,道理我明白的
0
HILOLT
HILOLT
//BEAN
public class UpdateInfo {
    private String version ;
    private String description ;
    private String url ;
    public String getVersion() {
        return version;
    }
    public void setVersion(String version) {
        this.version = version;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
   

}
---------------------------------------------
/*
 * 解析xml文档 , 将解析结果赋值与bean对象
 */

public class UpdateInfoParse {
    public static UpdateInfo getUpdateVersion(InputStream is) throws Exception {
        UpdateInfo upinfo = new UpdateInfo();
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(is, "utf-8");

        int type = parser.getEventType();
        while (type != XmlPullParser.END_DOCUMENT) {
            switch (type) {
            case XmlPullParser.START_TAG:
                if ("version".equals(parser.getName())) {
                    String version = parser.nextText();
                    upinfo.setVersion(version);
                } else if ("description".equals(parser.getName())) {
                    String description = parser.nextText();
                    upinfo.setDescription(description);
                } else if ("url".equals(parser.getName())) {
                    String url = parser.nextText();
                    upinfo.setUrl(url);

                    break;
                }
            }
            type = parser.next();
        }
        return upinfo;
    }
}

---------------------------------------------
//链接网络获取版本号 ,可能比较耗时 ,所以放在子线程里面
private class ChekVersionTask implements Runnable{
    @Override
    public void run() {
        try{
        String path = getResources().getString(R.string.updateurl);//获取路径
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        if(conn.getResponseCode()==200){
            InputStream  is = conn.getInputStream();
            UpdateInfo = updateinfo = UpdateInfoParse.getUpdateVersion(is);
           
            Message msg = Message.obtain();
            msg.what = CONNECT_SUCCESS;
            handler.sendMessage(msg);
        }else{
            Message msg = Message.obtain();
            msg.what = SERVER_ERROR;
            handler.sendMessage(msg);
        }
        }catch(Exception e){
            e.printStackTrace();
            Message msg = Message.obtain();
            msg.what = CONNECT_ERROR;
            handler.sendMessage(msg);
        }
    }
   
}
---------------------------------------------
//主线程接收消息
private Handler handler = new Handler(){
    public void handleMessage(Message msg) {
        switch (msg.what) {
       
        case CONNECT_ERROR:
            Toast.makeText(SplashActivity.this, "网络链接错误", 0).show();
            loadMainUI();
            break;
        case DOWNLOAD_ERROR:
            Toast.makeText(SplashActivity.this, "下载错误", 0).show();
            loadMainUI();
            break;
        case SERVER_ERROR:
            Toast.makeText(SplashActivity.this, "服务器错误", 0).show();
            loadMainUI();
            break;
        case CONNECT_SUCCESS:
            if(version.equals(updateinfo.getVersion())){
                Log.i(TAG,"版本号最新,无需下载");
            }else{
                Log.i(TAG,"版本号不同,弹出升级对话框");
                AlertDialog.Builder builder = new Builder(SplashActivity.this);
                builder.setTitle("升级信息");
                builder.setMessage(updateinfo.getDescription());
                builder.setPositiveButton("确认",new OnClickListener() {
                   
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Log.i(TAG,"下载地址"+updateinfo.getUrl());
                        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                            pd = new ProgressDialog(SplashActivity.this);
                            pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                            pd.setMessage("正在下载");
                            pd.show();
                            new Thread(){
                               

                                public void run() {
                                    try{
                                        File file = DownloadService.downfile(updateinfo.getUrl(), pd);
                                        pd.dismiss();
                                        Intent intent = new Intent();
                                        intent.setAction(Intent.ACTION_VIEW);//
                                        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                                        startActivity(intent);
                                    }catch(Exception e){
                                        e.printStackTrace();
                                        Message msg = Message.obtain();
                                        msg.what = DOWNLOAD_ERROR;
                                        handler.sendMessage(msg);
                                        pd.dismiss();
                                    }
                                   
                                };
                               
                            }.start();
                        }else {
                            Toast.makeText(SplashActivity.this, "sd卡不可用", 0).show();
                            return;
                        }

                    }
                });

                builder.setNegativeButton("下次", new OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        loadMainUI();
                    }
                });
                builder.create().show();
               
               
            }

        }
    };
   
};
---------------------------------------------
public class DownloadService {

    /**
     * 下载某个path对应的文件
     * @param path
     * @param pd
     * @return 文件对象
     */
    public static File downfile(String path, ProgressDialog pd) throws Exception{
        //http://192.168.1.247:8080/version2_0.apk
        URL url = new URL(path);
        HttpURLConnection conn =  (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        int length =    conn.getContentLength();
         pd.setMax(length);
       
        InputStream is = conn.getInputStream();
        String filename = getFileName(path);
        File file = new File(Environment.getExternalStorageDirectory(),filename);
        FileOutputStream fos = new FileOutputStream(file);
       
        byte[] buffer = new byte[1024];
        int len=0;
        int total = 0;
        while( (len =is.read(buffer))!=-1){
            fos.write(buffer, 0, len);
            Thread.sleep(10);
            total += len;
            pd.setProgress(total);
        }
        fos.flush();
        fos.close();
        is.close();
        return file;
    }
   
    public static String getFileName(String path){
        int index = path.lastIndexOf("/")+1;
        return path.substring(index, path.length());
    }
}
够详细吗 ?
0
HILOLT
HILOLT

//获取apk版本号 :

public String getAppVersion(){

        packageManager = getPackageManager();
        try {
            //第一个参数是包名,也可以写成getPackageName() , 第二个参数写0即可
            PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
            return packageInfo.versionName;
        } catch (Exception e) {
            e.printStackTrace();
            return "版本号未知";
        }
       
    }
0
1
15838138481

详细的我都不好意思了

0
1
15838138481

HILOLT,您qq号多少?

 

返回顶部
顶部