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();
}
}
}