android的下载和更新

Android下载APK

今天做一个下载更新的操作,会出现下载过程中中断,所以重新整理一下下载。记录一下。
使用的工具类有两个VersionUtils.class和UpdateManager.class


public class VersionUtils{   

/**
比较版本号的大小,serVersion大则返回一个正数,localVersion大返回一个负数,相等返回0
**/

 public class VersionUtil {

/**
 * 比较版本号的大小,serVersion大则返回一个正数,localVersion大返回一个负数,相等则返回0
 * 
 * @param serVersion
 * @param localVersion
 * @return
 */
public static int compareVersion(String serVersion, String localVersion) {
    if (serVersion == null || localVersion == null) {   
        return 0;
    }
    String[] versionArray1 = serVersion.split("\\.");
    String[] versionArray2 = localVersion.split("\\.");
    int idx = 0;
    int minLength = Math.min(versionArray1.length, versionArray2.length);
    int diff = 0;
    while (idx < minLength && (diff = versionArray1[idx].length() - versionArray2[idx].length()) == 0
            && (diff = versionArray1[idx].compareTo(versionArray2[idx])) == 0) {
        ++idx;
    }
    diff = (diff != 0) ? diff : versionArray1.length - versionArray2.length;
    return diff;
}
/**
 * Get local version value in current APK.
 * 
 * @return Local Version in my phone.
 */
public static String getVersion(Context context) {
    try {
        PackageManager manager = context.getPackageManager();
        PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
        String version = info.versionName;
        return version;
    } catch (Exception e) {
        e.printStackTrace();
        return "";
    }
}


/**
 * 获取APP版本号(内部识别号)(VersionCode)
 * */
public static int getVersionCode(Context context) {
    try {
        PackageInfo pi=context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
        return pi.versionCode;
    } catch (NameNotFoundException e) {
        e.printStackTrace();
        return 0;
    }
}
}    

对于 UpdateManager.class

 public class UpdateManager {
 private Context mContext;

//提示语
private String updateMsg = "有最新的软件包哦,亲快下载吧~";

//返回的安装包url
private String apkUrl="";


private Dialog noticeDialog;

private Dialog downloadDialog;
 /* 下载包安装路径 */
private static final String savePath = "/sdcard/updatedemo/";

private static final String saveFileName = savePath + "bike.apk";

/* 进度条与通知ui刷新的handler和msg常量 */
private ProgressBar mProgress;


private static final int DOWN_UPDATE = 1;

private static final int DOWN_OVER = 2;

private int progress;

private Thread downLoadThread;

private boolean interceptFlag = false;

private Handler mHandler = new Handler(){
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case DOWN_UPDATE:
            mProgress.setProgress(progress);
            break;
        case DOWN_OVER:
            System.out.println("下载完成");
            installApk();
            break;
        default:
            break;
        }
    };
};

public UpdateManager(Context context,String url) {
    this.mContext = context;
    this.apkUrl = url;
}

//外部接口让主Activity调用
public void checkUpdateInfo(){
    showNoticeDialog();
}


private void showNoticeDialog(){
//  AlertDialog.Builder builder = new Builder(mContext);
    Builder builder=new Builder(mContext);
    builder.setTitle("软件版本更新");
    builder.setMessage(updateMsg);
    builder.setPositiveButton("下载", new OnClickListener() {         
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
            showDownloadDialog();           
        }
    });
    builder.setNegativeButton("以后再说", new OnClickListener() {           
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();               
        }
    });
    noticeDialog = builder.create();
    noticeDialog.show();
}

private void showDownloadDialog(){
    Builder builder = new Builder(mContext);
    builder.setTitle("软件版本更新");

    final LayoutInflater inflater = LayoutInflater.from(mContext);
    View v = inflater.inflate(R.layout.progress, null);
    mProgress = (ProgressBar)v.findViewById(R.id.progress);

    builder.setView(v);
    builder.setNegativeButton("取消", new OnClickListener() { 
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
            interceptFlag = true;
        }
    });
    downloadDialog = builder.create();
    downloadDialog.show();

    downloadApk();
}

private Runnable mdownApkRunnable = new Runnable() {    
    @Override
    public void run() {
        try {
            Log.i("Test", "============================" + apkUrl);
            URL url = new URL(apkUrl);

  //                URL url = new URL("http://softfile.3g.qq.com:8080/msoft/179/24659/43549/qq_hd_mini_1.4.apk");

            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.connect();
            int length = conn.getContentLength();
            InputStream is = conn.getInputStream();

            File file = new File(savePath);
            if(!file.exists()){
                file.mkdir();
            }
            //String apkFile = saveFileName;
            String fileName = "bike.apk";
            File ApkFile = new File(file,fileName);
            ApkFile.createNewFile();
            FileOutputStream fos = new FileOutputStream(ApkFile);

            BufferedInputStream bis = new BufferedInputStream(is);

            int count = 0;
            byte buf[] = new byte[1024];

            do{                 
                int numread = bis.read(buf);
                count += numread;
                progress =(int)(((float)count / length) * 100);
                //更新进度
                mHandler.sendEmptyMessage(DOWN_UPDATE);
                if(numread <= 0){   
                    //下载完成通知安装
                    mHandler.sendEmptyMessage(DOWN_OVER);
                    break;
                }
                fos.write(buf,0,numread);
                fos.flush();
            }while(!interceptFlag);//点击取消就停止下载.

            fos.close();
            is.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch(IOException e){
            e.printStackTrace();
        }

    }
};

 /**
 * 下载apk
  */

private void downloadApk(){
    downLoadThread = new Thread(mdownApkRunnable);
    downLoadThread.start();
}
 /**
 * 安装apk
  */
private void installApk(){
    File apkfile = new File(saveFileName);
    if (!apkfile.exists()) {
        return;
    }    
    Intent i = new Intent(Intent.ACTION_VIEW);
    i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive"); 
    mContext.startActivity(i);

}
}

在对应的activity中,先和本地的版本进行获取和对比

public class MainActivity extends Activity {
private UpdateInfo mUpdateInfo;

private UpdateManager mUpdateManager;
private String updataURl ="http://www.baidu.com.apk"


private Button bt_down;
@Override
protected void onCreate(Bundle savedInstanceState) {
    getWindow().setFormat(PixelFormat.TRANSLUCENT);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
}

private void initView() {
    bt_down = (Button) findViewById(R.id.bt_down);
    bt_down.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            getDataFromHttpByVolley();
        }
    });


}


private void getDataFromHttpByVolley() {
           String serVersion = "1.2";

                    // Local APK Version in my phone
                    String localVersion = VersionUtil.getVersion(MainActivity.this);
                    Log.e("MianAct","本地版本:"+localVersion);
           int versionresult = VersionUtil.compareVersion(
                            serVersion, localVersion);
                    if (versionresult > 0) {
 //                                updateurl = Constant.SERVER_IP + datalist.getUrl();
                        mUpdateManager = new UpdateManager(
                                MainActivity.this, updateurl);
                        mUpdateManager.checkUpdateInfo();
                    }
             }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值