Android提示版本更新的实现
16lz
2022-08-09
一、首先,参考了以下文章《Android自动检测版本及自动升级》
http://www.linuxidc.com/Linux/2011-10/45718p2.htm:
步骤:
1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。
2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。
3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。
[java] view plain copy- 获取当前程序的版本号:
- 1./*
- 2.*获取当前程序的版本号
- 3.*/
- 4.privateStringgetVersionName()throwsException{
- 5.//获取packagemanager的实例
- 6.PackageManagerpackageManager=getPackageManager();
- 7.//getPackageName()是你当前类的包名,0代表是获取版本信息
- 8.PackageInfopackInfo=packageManager.getPackageInfo(getPackageName(),0);
- 9.returnpackInfo.versionName;
- 10.}
- 获取服务器端的版本号:
- 1./*
- 2.*用pull解析器解析服务器返回的xml文件(xml封装了版本号)
- 3.*/
- 4.publicstaticUpdataInfogetUpdataInfo(InputStreamis)throwsException{
- 5.XmlPullParserparser=Xml.newPullParser();
- 6.parser.setInput(is,"utf-8");//设置解析的数据源
- 7.inttype=parser.getEventType();
- 8.UpdataInfoinfo=newUpdataInfo();//实体
- 9.while(type!=XmlPullParser.END_DOCUMENT){
- 10.switch(type){
- 11.caseXmlPullParser.START_TAG:
- 12.if("version".equals(parser.getName())){
- 13.info.setVersion(parser.nextText());//获取版本号
- 14.}elseif("url".equals(parser.getName())){
- 15.info.setUrl(parser.nextText());//获取要升级的APK文件
- 16.}elseif("description".equals(parser.getName())){
- 17.info.setDescription(parser.nextText());//获取该文件的信息
- 18.}
- 19.break;
- 20.}
- 21.type=parser.next();
- 22.}
- 23.returninfo;
- 24.}
- 从服务器下载apk:
- 1.publicstaticFilegetFileFromServer(Stringpath,ProgressDialogpd)throwsException{
- 2.//如果相等的话表示当前的sdcard挂载在手机上并且是可用的
- 3.if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
- 4.URLurl=newURL(path);
- 5.HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
- 6.conn.setConnectTimeout(5000);
- 7.//获取到文件的大小
- 8.pd.setMax(conn.getContentLength());
- 9.InputStreamis=conn.getInputStream();
- 10.Filefile=newFile(Environment.getExternalStorageDirectory(),"updata.apk");
- 11.FileOutputStreamfos=newFileOutputStream(file);
- 12.BufferedInputStreambis=newBufferedInputStream(is);
- 13.byte[]buffer=newbyte[1024];
- 14.intlen;
- 15.inttotal=0;
- 16.while((len=bis.read(buffer))!=-1){
- 17.fos.write(buffer,0,len);
- 18.total+=len;
- 19.//获取当前下载量
- 20.pd.setProgress(total);
- 21.}
- 22.fos.close();
- 23.bis.close();
- 24.is.close();
- 25.returnfile;
- 26.}
- 27.else{
- 28.returnnull;
- 29.}
- 30.}
匹配、下载、自动安装:
[java] view plain copy- /*
- *从服务器获取xml解析并进行比对版本号
- */
- publicclassCheckVersionTaskimplementsRunnable{
- publicvoidrun(){
- try{
- //从资源文件获取服务器地址
- Stringpath=getResources().getString(R.string.serverurl);
- //包装成url的对象
- URLurl=newURL(path);
- HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
- conn.setConnectTimeout(5000);
- InputStreamis=conn.getInputStream();
- info=UpdataInfoParser.getUpdataInfo(is);
- if(info.getVersion().equals(versionname)){
- Log.i(TAG,"版本号相同无需升级");
- LoginMain();
- }else{
- Log.i(TAG,"版本号不同,提示用户升级");
- Messagemsg=newMessage();
- msg.what=UPDATA_CLIENT;
- handler.sendMessage(msg);
- }
- }catch(Exceptione){
- //待处理
- Messagemsg=newMessage();
- msg.what=GET_UNDATAINFO_ERROR;
- handler.sendMessage(msg);
- e.printStackTrace();
- }
- }
- }
- Handlerhandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- //TODOAuto-generatedmethodstub
- super.handleMessage(msg);
- switch(msg.what){
- caseUPDATA_CLIENT:
- //对话框通知用户升级程序
- showUpdataDialog();
- break;
- caseGET_UNDATAINFO_ERROR:
- //服务器超时
- Toast.makeText(getApplicationContext(),"获取服务器更新信息失败",1).show();
- LoginMain();
- break;
- caseDOWN_ERROR:
- //下载apk失败
- Toast.makeText(getApplicationContext(),"下载新版本失败",1).show();
- LoginMain();
- break;
- }
- }
- };
- /*
- *
- *弹出对话框通知用户更新程序
- *
- *弹出对话框的步骤:
- *1.创建alertDialog的builder.
- *2.要给builder设置属性,对话框的内容,样式,按钮
- *3.通过builder创建一个对话框
- *4.对话框show()出来
- */
- protectedvoidshowUpdataDialog(){
- AlertDialog.Builderbuiler=newBuilder(this);
- builer.setTitle("版本升级");
- builer.setMessage(info.getDescription());
- //当点确定按钮时从服务器上下载新的apk然后安装
- builer.setPositiveButton("确定",newOnClickListener(){
- publicvoidonClick(DialogInterfacedialog,intwhich){
- Log.i(TAG,"下载apk,更新");
- downLoadApk();
- }
- });
- //当点取消按钮时进行登录
- builer.setNegativeButton("取消",newOnClickListener(){
- publicvoidonClick(DialogInterfacedialog,intwhich){
- //TODOAuto-generatedmethodstub
- LoginMain();
- }
- });
- AlertDialogdialog=builer.create();
- dialog.show();
- }
- /*
- *从服务器中下载APK
- */
- protectedvoiddownLoadApk(){
- finalProgressDialogpd;//进度条对话框
- pd=newProgressDialog(this);
- pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- pd.setMessage("正在下载更新");
- pd.show();
- newThread(){
- @Override
- publicvoidrun(){
- try{
- Filefile=DownLoadManager.getFileFromServer(info.getUrl(),pd);
- sleep(3000);
- installApk(file);
- pd.dismiss();//结束掉进度条对话框
- }catch(Exceptione){
- Messagemsg=newMessage();
- msg.what=DOWN_ERROR;
- handler.sendMessage(msg);
- e.printStackTrace();
- }
- }}.start();
- }
- //安装apk
- protectedvoidinstallApk(Filefile){
- Intentintent=newIntent();
- //执行动作
- intent.setAction(Intent.ACTION_VIEW);
- //执行的数据类型
- intent.setDataAndType(Uri.fromFile(file),"application/vnd.Android.package-archive");//编者按:此处Android应为android,否则造成安装不了
- startActivity(intent);
- }
- /*
- *进入程序的主界面
- */
- privatevoidLoginMain(){
- Intentintent=newIntent(this,MainActivity.class);
- startActivity(intent);
- //结束掉当前的activity
- this.finish();
- }
二、参考后使用情况:
1.可以下载apk,但安装失败:
1)以为配置文件中需定义了android.permission.INSTALL_PACKAGES,其实不需;
2)以为是要在执行安装的activity中配置
[html] view plain copy- <intent-filter>
- <actionandroid:name="android.intent.action.VIEW"/>
- <categoryandroid:name="android.intent.category.DEFAULT"/>
- </intent-filter>
,其实不是;
3)代码中application/vnd.Android.package-archive有一个字母A大写了,改小写后解决;
更多相关文章
- 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
- Android屏幕分辨率正确获取及PX,DPI,DP,SP等的对应关系
- android“设置”里的版本号
- android 获取唯一标识
- android拍照与读取相册
- Android(安卓)热点开关状态的判断和获取热点ssid
- Andorid Dialog 示例【慢慢更新】
- Android软键盘适配问题
- AIR Native Extension的使用(Android)一 : 打包ane