android 软件在线版本更新功能的实现

 

首先需要建立几个辅助类:

一、ConnectUtil类,判断时候具有可用网络,需要借助系统的ConnectivityManager

public class ConnectUtil {
    public static boolean isConnect(Context context){
        ConnectivityManager manager=(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if(manager!=null){
            NetworkInfo info=manager.getActiveNetworkInfo();
            if(info!=null&&info.isConnected()){
                if(info.getState()==NetworkInfo.State.CONNECTED){
                    return true;
                }
            }
        }
        return false;
    }
}

二、检查已有的版本信息,借助系统的packagerManager类

    PackageManager manager = getPackageManager();
        PackageInfo info;
        try {
            info = manager.getPackageInfo(getPackageName(), 0);
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        String versionName = info.versionName;
        // 下载时刻出现一个进度条
        pd = new ProgressDialog(this);

三、从服务器上下载apk文件

这里有两个问题尚未彻底弄明白:URLencoding进行URL编码的意义何在

封装后的HttpGet、HttpPost仅仅适用于请求返回为字符串的情况吗?如果请求返回二进制的apk,或者图片,就必须借助原始的HttpURLConnection?

package com.example.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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 java.net.URLEncoder;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpConnection;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
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.apache.http.util.EncodingUtils;
import org.apache.http.util.EntityUtils;

import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.os.Environment;

public class DownLoadUtil {
    // 下载apk并将其保存在sd卡的路径中
    public void downloadApk(String urlPath, ProgressDialog pd) {
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            BufferedInputStream bis = null;
            BufferedOutputStream bos = null;
            FileOutputStream fos = null;

            try {
                // url中带有中文,之前首先需要编码
                // 应当仅仅编码其中的中文部分
                /*
                 * System.out.println("编码前"+urlPath);
                 * System.out.println("编码后"+URLEncoder.encode(urlPath));
                 */
                urlPath = URLEncoder.encode(urlPath).replaceAll("%3A", ":")
                        .replaceAll("%2F", "/");
                System.out.println(urlPath);
                URL url = new URL(urlPath);
                HttpURLConnection connection = (HttpURLConnection) url
                        .openConnection();
                connection.setConnectTimeout(5000);
                bis = new BufferedInputStream(connection.getInputStream());
                File file = new File(Environment.getExternalStorageDirectory()
                        + "/update/");
                if (!file.exists()) {
                    file.mkdirs();
                }
                // 如果下载的时候需要出现进度条

                // 如果实现文件不存在的话,outputstream构造函数调用时候会自动创建新文件
                //但是前提是目录需要存在
                fos = new FileOutputStream(file.getAbsolutePath() + "/绿萝空气.apk");
                bos = new BufferedOutputStream(fos);
                byte[] buffer = new byte[1024];
                int len = 0;
                int total = 0;
                pd.setMax(connection.getContentLength());
                while ((len = bis.read(buffer)) > 0) {
                    bos.write(buffer);
                    total += len;
                    pd.setProgress(total);
                    if (total == pd.getMax()) {
                        pd.dismiss();
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();

            } finally {
                try {
                    bis.close();
                    fos.close();
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }

    }

    /*// 如果发送的是get请求,使用这种方法可以下载apk么?
    public String sendGetRequest(String url) {
        HttpGet get = new HttpGet(url);
        HttpClient client = new DefaultHttpClient();
        try {
            HttpResponse result = client.execute(get);

            if (result != null
                    && result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                
                 * BufferedInputStream bis=new
                 * BufferedInputStream(result.getEntity().getContent()) ; byte[]
                 * buffer=new byte[bis.available()]; bis.read(buffer);
                 * System.out.println(new String(buffer));
                 
                String resultString = EntityUtils.toString(result.getEntity());
                // System.out.println(resultString);
                return resultString;
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }
        return null;

    }
*/
}


apk的安装,借助系统的intent

    protected void installApk(File file) {
        Intent intent = new Intent();
        // 执行动作
        // 这里是系统配置的intent,因此不需要在配置文件中进行过多的更改
        intent.setAction(Intent.ACTION_VIEW);
        // 执行的数据类型
        intent.setDataAndType(Uri.fromFile(file),
                "application/vnd.android.package-archive");
        startActivity(intent);
    }

 

这时候发现了一个问题,apk安装时候提示“解析包时出现问题”;是由于签名的原因吗?不很确定

转载于:https://www.cnblogs.com/bobodeboke/archive/2013/05/11/3072536.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值