Android在线更新版本(服务端+客户端Code)
16lz
2021-01-26
本案例分为服务器端 客户端 服务端: 使用MyEclipse 搭建的java Web项目 功能:当客户端请求服务器时,返回json数据 项目目录:
注意:jar包必须都得导入,否则会出错,都是相互依赖的。 主要功能代码:InstallAction.java publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //在服务器上设置好文件的存放路径 StringapkUrl="http://192.168.1.101:8080/InstallJson/Android_install.apk"; PrintWriterprintWriter=response.getWriter(); Messagemessage=newMessage();//声明一个实体类并写赋值 message.setVersionCode(2); message.setApkUrl(apkUrl); //生成map对象,设置数据message Map<String,Object>map=newHashMap<String,Object>(); map.put("message",message); //利用JSONSerializer.toJSON(map)输出json数据格式 printWriter.println(JSONSerializer.toJSON(map)); printWriter.flush();//推出 printWriter.close();//关闭 } Message.java publicclassMessage{ privateintversionCode; privateStringapkUrl; publicintgetVersionCode(){ returnversionCode; } publicvoidsetVersionCode(intversionCode){ this.versionCode=versionCode; } publicStringgetApkUrl(){ returnapkUrl; } publicvoidsetApkUrl(StringapkUrl){ this.apkUrl=apkUrl; } 客户端: 功能:启动时自动检测更新,如果更新则下载->安装到手机 项目目录结构:
PackageUtils:操作PackageManager,得到清单的一些信息 PackageManager:
newVersonCode = install .getVersionCode();//新的版本 //判断 if(packageUtils.isUpdate(oldVersionCode,newVersonCode)){ dispplayAlert(); alert.show(); } publicclassreadJsonTaskextendsAsyncTask<String,Void,Install> 在访问服务器的异步任务中,参数分别是:地址、无、Install对象(得到code和版本信息) HttpUtils /** *Http操作工具类: *定义获取getInstallJson方法来获取json数据, *@parampath参数为请求地址 *@return返回String字符串jsonString */ publicstaticStringgetInstallJson(Stringpath){ StringjsonString=null; HttpClienthttpClient=newDefaultHttpClient(); try{ HttpGethttpGet=newHttpGet(path); HttpResponsers=httpClient.execute(httpGet);//执行操作并获取HttpResponse对象(包含获取的内容数据) if(rs.getStatusLine().getStatusCode()==200){ jsonString=EntityUtils.toString(rs.getEntity());//得到Sting } }catch(ClientProtocolExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } returnjsonString; } /** *parseJson方法解析json数据 *@paramjson参数为jsons字符串 *@return返回一个Instaljavabean实体类 */ publicstaticInstallparseJson(Stringjson){ Installinstall=newInstall();//声明javabean为对象赋值 try{ JSONObjectjsonObject=newJSONObject(json) .getJSONObject("message"); install.setVersionCode(jsonObject.getInt("versionCode")); install.setVersionUrl(jsonObject.getString("apkUrl")); }catch(JSONExceptione){ e.printStackTrace(); } returninstall; } /** *下载新版本Apk *@parampath下载路径 *@paramfileName文件名称 *@return返回存储路径(用来写入SD卡) */ publicstaticStringdownloadApk(Stringpath,StringfileName){ byte[]data=null; Stringstate=Environment.getExternalStorageState();//sd卡的状态 Fileroot=Environment.getExternalStorageDirectory();//根目录 FileOutputStreamoutputStream=null; HttpClienthttpClient=newDefaultHttpClient(); try{ HttpGethttpGet=newHttpGet(path); HttpResponsers=httpClient.execute(httpGet); if(rs.getStatusLine().getStatusCode()==200){ data=EntityUtils.toByteArray(rs.getEntity()); //判断是否可写入sd卡 if(state.equals(Environment.MEDIA_MOUNTED)){ outputStream=newFileOutputStream( newFile(root,fileName)); outputStream.write(data,0,data.length); } } }catch(ClientProtocolExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }finally{ if(outputStream!=null){ try{ outputStream.close(); }catch(IOExceptione){ e.printStackTrace(); } } } returnroot.getAbsolutePath()+"/"+fileName; } MainActivity:主activity //安装apk应用传入一个file文件路径 privatevoidopenFile(Filefile){ Intentintent=newIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startActivity(intent); }
AndroidTest:单元测试 程序代码:下载 程序截图:未完待续
注意:jar包必须都得导入,否则会出错,都是相互依赖的。 主要功能代码:InstallAction.java publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //在服务器上设置好文件的存放路径 StringapkUrl="http://192.168.1.101:8080/InstallJson/Android_install.apk"; PrintWriterprintWriter=response.getWriter(); Messagemessage=newMessage();//声明一个实体类并写赋值 message.setVersionCode(2); message.setApkUrl(apkUrl); //生成map对象,设置数据message Map<String,Object>map=newHashMap<String,Object>(); map.put("message",message); //利用JSONSerializer.toJSON(map)输出json数据格式 printWriter.println(JSONSerializer.toJSON(map)); printWriter.flush();//推出 printWriter.close();//关闭 } Message.java publicclassMessage{ privateintversionCode; privateStringapkUrl; publicintgetVersionCode(){ returnversionCode; } publicvoidsetVersionCode(intversionCode){ this.versionCode=versionCode; } publicStringgetApkUrl(){ returnapkUrl; } publicvoidsetApkUrl(StringapkUrl){ this.apkUrl=apkUrl; } 客户端: 功能:启动时自动检测更新,如果更新则下载->安装到手机 项目目录结构:
PackageUtils:操作PackageManager,得到清单的一些信息 PackageManager:
java.lang.Object | |
android.content.pm.PackageManagerpublic abstractPackageManagergetPackageManager()Added in API level 1Return PackageManager instance to find global package information. 得到关于管理设备的对象PackageManager,调用PackageManager的getPackageManageer()获得PackageInfo对象, 在PackageInfo对象中获取信息 oldVersionCode=packageUtils.getVersionCode();//定义的获取本地版本code 判断是否更新方法://是否更新 publicbooleanisUpdate(intoldCode,intnewCode){ booleanflag=oldCode<newCode?true:false; returnflag; } 在程序运行的时候,开一个异步任务,用来检测版本code是否一致。 install=newreadJsonTask().execute(path).get();直接返回一个install对象, |
AndroidTest:单元测试 程序代码:下载 程序截图:未完待续
更多相关文章
- ReactNative 中 android按两次返回键退出当前应用程序
- Android(安卓)WebView中无法用JS调用Java对象的问题
- Android如何获取SDCard 内存
- android 网络编程 HttpGet类和HttpPost类使用详解
- android打开相册选取图片或打开相机拍照并进行裁剪
- Android黑群出品:SQLite数据库的使用和升级
- Android(安卓)Studio创建Serializable对象时自动生成serialVersi
- 2016~4.12Android(安卓)之图片处理
- Android控制软键盘的现实与隐藏