您的位置:

java判断app版本号(app的版本号怎么看)

本文目录一览:

Java该如何实现:根据APP的不同版本调用不同的接口服务。

可以在所有因版本不同的业务逻辑层,注解service时,区分将版本号和service做关联,根据app传的版本号注入对应版本的service即可

如何自定义和查看java程序版本号

可以在主类中设常量记录版本号。

然后命令行执行的时候,多送个参数进去(如version之类的),主类中收到此指令则返回版本号信息。

java如何根据apk路径读取apk的包名以及版本号

IO流,在程序中根据路径可以找到报名,不过你这个程序部署到真机上就不行了

java 怎么判断ie浏览器的版本

 JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本。JavaScript判断浏览

器类型一般有两种办法,一种是根据各种浏览器独有的属性来分辨,另一种是通过分析浏览器的userAgent属性来判断的。在许多情况下,值判断出浏览器

类型之后,还需判断浏览器版本才能处理兼容性问题,而判断浏览器的版本一般只能通过分析浏览器的userAgent才能知道。

navigator对象

包含了正在使用的 Navigator 的版本信息。 JavaScript 客户端运行时刻引擎自动创建 navigator 对象。 详细的介绍可以参照【】,这里只是简单说下其属性和方法。

属性概览

appCodeName 指定浏览器的代码名称。

appName 指定浏览器的名称。

appVersion 指定 Navigator 的版本信息。

language 标明正在使用的 Navigator 的翻译语种。

mimeTypes 客户端支持的所有 MIME 类型数组。

platform 标明了 Navigator 编译适合的机器类型。

plugins 客户端已安装的所有插件数组。

userAgent 指定了用户代理头。

方法概览

javaEnabled 测试是否允许 Java。

plugins.refresh 使新安装的插件有效,并可选重新装入已打开的包含插件的文档。

preference 允许一个已标识的脚本获取并设置特定的 Navigator 参数。

taintEnabled 指定是否允许数据污点。

简单标注一下,判断浏览器的名称可以根据appName判断,例如:

var ie=navigator.appName == “Microsoft Internet Explorer” ? true : false;

浏览器的特征及其userAgent

关于各种浏览器的特征及其userAgent,可以参照【】,这篇文章介绍的比较详细。

简单罗列如下:

IE

只有IE支持创建ActiveX控件,因此她有一个其他浏览器没有的东西,就是ActiveXObject函数。

而IE各个版本典型的userAgent如下:

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)

其中,版本号是MSIE之后的数字。

Firefox

Firefox中的DOM元素都有一个getBoxObjectFor函数,用来获取该DOM元素的位置和大小(IE对应的中是getBoundingClientRect函数)。

这是Firefox独有的,判断它即可知道是当前浏览器是Firefox。

Firefox几个版本的userAgent大致如下:

Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1

Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3

Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12 其中,版本号是Firefox之后的数字。

Opera

Opera提供了专门的浏览器标志,就是window.opera属性。

Opera典型的userAgent如下:

Opera/9.27 (Windows NT 5.2; U; zh-cn)

Opera/8.0 (Macintosh; PPC Mac OS X; U; en)

Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0

其中,版本号是靠近Opera的数字。

Safari

Safari浏览器中有一个其他浏览器没有的openDatabase函数,可做为判断Safari的标志。

Safari典型的userAgent如下:

Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13

Mozilla/5.0 (iPhone; U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3

其版本号是Version之后的数字。

Chrome

Chrome有一个MessageEvent函数,但Firefox也有。不过,好在Chrome并没有Firefox的getBoxObjectFor函数,根据这个条件还是可以准确判断出Chrome浏览器的。

目前,Chrome的userAgent是:

Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13

其中,版本号在Chrome之后的数字。

有趣的是,Chrome的userAgent还包含了Safari的特征,也许这就是Chrome可以运行所有Apple浏览器应用的基础吧。

Navigator

目前,Navigator的userAgent是:

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6

其中,版本号在Navigator之后的数字。

通过观察以上各浏览器的差异,可以用JavaScript区分出各浏览器的,但没有判断是否兼容w3c标准,看了看ExtJs的源代码,发现其中就有对浏览器类型以及版本和操作系统的判断。

源码如下:

ua = navigator.userAgent.toLowerCase(),

check = function(r){

return r.test(ua);

},

isStrict = patMode == “CSS1Compat”,

isOpera = check(/opera/),

isChrome = check(/chrome/),

isWebKit = check(/webkit/),

isSafari = !isChrome check(/safari/),

isSafari3 = isSafari check(/version\/3/),

isSafari4 = isSafari check(/version\/4/),

isIE = !isOpera check(/msie/),

isIE7 = isIE check(/msie 7/),

isIE8 = isIE check(/msie 8/),

isGecko = !isWebKit check(/gecko/),

isGecko3 = isGecko check(/rv:1\.9/),

isBorderBox = isIE !isStrict,

isWindows = check(/windows|win32/),

isMac = check(/macintosh|mac os x/),

isAir = check(/adobeair/),

isLinux = check(/linux/)

关于patMode

IE对盒模型的渲染在 Standards Mode和Quirks Mode是有很大差别的,在Standards Mode下对于盒模型的解释和其他的标准浏览器是一样,但在Quirks Mode模式下则有很大差别,而在不声明Doctype的情况下,IE默认又是Quirks Mode。所以为兼容性考虑,我们可能需要获取当前的文档渲染方式。

patMode正好派上用场,它有两种可能的返回值:BackCompat和CSS1Compat,对其解释如下:

BackCompat Standards-compliant mode is not switched on. (Quirks Mode)

CSS1Compat Standards-compliant mode is switched on. (Standards Mode)

在实际的项目中,我们还需要在获取浏览是否IE,这样就可以得到IE的渲染模式了。在ExtJs中的代码:isBorderBox=isIE!isStrict。

当文档有了标准声明时, patMode 的值就等于 “CSS1compat”, 因此, 我们可以根据 patMode 的值来判断文档是否加了标准声明

var height = patMode==”CSS1Compat” ? document.documentElement.clientHeight : document.body.clientHeight;

java 获取已安装的程序版本号,在控制面板中可以看到的版本号,怎么获取呢?

eclipse是绿色软件 可直接删除文件夹,如果你下载时是全部安到g盘,那么c盘的应该是其他软件的,不过看你那图是在c有残留,看到sun公司的都是java,环境变量就随便你了,以后可能再用就不用改

如何对Android的版本进行检测与更新

一、准备

1.检测当前版本的信息AndroidManifest.xml--manifest--android:versionName。

2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。

3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。

二、效果图

 

三、必要说明

服务器端存储apk文件,同时有version.xml文件便于比对更新。

?xml version="1.0" encoding="utf-8"?

info

version2.0/version

url;/url

description检测到最新版本,请及时更新!/description

url_server;/url_server

/info

通过一个实体类获取上述信息。

package com.android;

public class UpdataInfo {

private String version;

private String url;

private String description;

private String url_server;

public String getUrl_server() {

return url_server;

}

public void setUrl_server(String url_server) {

this.url_server = url_server;

}

public String getVersion() {

return version;

}

public void setVersion(String version) {

this.version = version;

}

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

}

apk和版本信息地址都放在服务器端的version.xml里比较方便,当然如果服务器端不变动,apk地址可以放在strings.xml里,不过版本号信息是新的,必须放在服务器端,xml地址放在strings.xml。

?xml version="1.0" encoding="utf-8"?

resources

string name="hello"Hello World, VersionActivity!/string

string name="app_name"Version/string

string name="url_server";/string

/resources

不知道读者发现没有,笔者犯了个错误,那就是url_server地址必须放在本地,否则怎么读取version.xml,所以url_server不必在实体类和version里添加,毕竟是现需要version地址也就是url_server,才能够读取version。

三、代码实现

?xml version="1.0" encoding="utf-8"?

LinearLayout xmlns:android=""

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical"

Button

android:id="@+id/btn_getVersion"

android:text="检查更新"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/

/LinearLayout

package com.android;

import java.io.InputStream;

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;

public class UpdataInfoParser {

public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{

XmlPullParser parser = Xml.newPullParser();

parser.setInput(is, "utf-8");

int type = parser.getEventType();

UpdataInfo info = new UpdataInfo();

while(type != XmlPullParser.END_DOCUMENT ){

switch (type) {

case XmlPullParser.START_TAG:

if("version".equals(parser.getName())){

info.setVersion(parser.nextText());

}else if ("url".equals(parser.getName())){

info.setUrl(parser.nextText());

}else if ("description".equals(parser.getName())){

info.setDescription(parser.nextText());

}

break;

}

type = parser.next();

}

return info;

}

}

package com.android;

import java.io.File;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.AlertDialog.Builder;

import android.app.ProgressDialog;

import android.content.DialogInterface;

import android.content.Intent;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

import android.widget.Toast;

public class VersionActivity extends Activity {

private final String TAG = this.getClass().getName();

private final int UPDATA_NONEED = 0;

private final int UPDATA_CLIENT = 1;

private final int GET_UNDATAINFO_ERROR = 2;

private final int SDCARD_NOMOUNTED = 3;

private final int DOWN_ERROR = 4;

private Button getVersion;

private UpdataInfo info;

private String localVersion;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

getVersion = (Button) findViewById(R.id.btn_getVersion);

getVersion.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

try {

localVersion = getVersionName();

CheckVersionTask cv = new CheckVersionTask();

new Thread(cv).start();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

});

}

private String getVersionName() throws Exception {

//getPackageName()是你当前类的包名,0代表是获取版本信息

PackageManager packageManager = getPackageManager();

PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),

0);

return packInfo.versionName;

}

public class CheckVersionTask implements Runnable {

InputStream is;

public void run() {

try {

String path = getResources().getString(R.string.url_server);

URL url = new URL(path);

HttpURLConnection conn = (HttpURLConnection) url

.openConnection();

conn.setConnectTimeout(5000);

conn.setRequestMethod("GET");

int responseCode = conn.getResponseCode();

if (responseCode == 200) {

// 从服务器获得一个输入流

is = conn.getInputStream();

}

info = UpdataInfoParser.getUpdataInfo(is);

if (info.getVersion().equals(localVersion)) {

Log.i(TAG, "版本号相同");

Message msg = new Message();

msg.what = UPDATA_NONEED;

handler.sendMessage(msg);

// LoginMain();

} else {

Log.i(TAG, "版本号不相同 ");

Message msg = new Message();

msg.what = UPDATA_CLIENT;

handler.sendMessage(msg);

}

} catch (Exception e) {

Message msg = new Message();

msg.what = GET_UNDATAINFO_ERROR;

handler.sendMessage(msg);

e.printStackTrace();

}

}

}

Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

super.handleMessage(msg);

switch (msg.what) {

case UPDATA_NONEED:

Toast.makeText(getApplicationContext(), "不需要更新",

Toast.LENGTH_SHORT).show();

case UPDATA_CLIENT:

//对话框通知用户升级程序

showUpdataDialog();

break;

case GET_UNDATAINFO_ERROR:

//服务器超时

Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1).show();

break;

case DOWN_ERROR:

//下载apk失败

Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show();

break;

}

}

};

/*

*

* 弹出对话框通知用户更新程序

*

* 弹出对话框的步骤:

* 1.创建alertDialog的builder.

* 2.要给builder设置属性, 对话框的内容,样式,按钮

* 3.通过builder 创建一个对话框

* 4.对话框show()出来

*/

protected void showUpdataDialog() {

AlertDialog.Builder builer = new Builder(this);

builer.setTitle("版本升级");

builer.setMessage(info.getDescription());

//当点确定按钮时从服务器上下载 新的apk 然后安装 װ

builer.setPositiveButton("确定", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

Log.i(TAG, "下载apk,更新");

downLoadApk();

}

});

builer.setNegativeButton("取消", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

//do sth

}

});

AlertDialog dialog = builer.create();

dialog.show();

}

/*

* 从服务器中下载APK

*/

protected void downLoadApk() {

final ProgressDialog pd; //进度条对话框

pd = new ProgressDialog(this);

pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

pd.setMessage("正在下载更新");

pd.show();

new Thread(){

@Override

public void run() {

try {

File file = DownLoadManager.getFileFromServer(info.getUrl(), pd);

sleep(3000);

installApk(file);

pd.dismiss(); //结束掉进度条对话框

} catch (Exception e) {

Message msg = new Message();

msg.what = DOWN_ERROR;

handler.sendMessage(msg);

e.printStackTrace();

}

}}.start();

}

//安装apk

protected void installApk(File file) {

Intent intent = new Intent();

//执行动作

intent.setAction(Intent.ACTION_VIEW);

//执行的数据类型

intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");

startActivity(intent);

}

}

package com.android;

import java.io.BufferedInputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import android.app.ProgressDialog;

import android.os.Environment;

public class DownLoadManager {

public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{

//如果相等的话表示当前的sdcard挂载在手机上并且是可用的

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

URL url = new URL(path);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(5000);

//获取到文件的大小

pd.setMax(conn.getContentLength());

InputStream is = conn.getInputStream();

File file = new File(Environment.getExternalStorageDirectory(), "updata.apk");

FileOutputStream fos = new FileOutputStream(file);

BufferedInputStream bis = new BufferedInputStream(is);

byte[] buffer = new byte[1024];

int len ;

int total=0;

while((len =bis.read(buffer))!=-1){

fos.write(buffer, 0, len);

total+= len;

//获取当前下载量

pd.setProgress(total);

}

fos.close();

bis.close();

is.close();

return file;

}

else{

return null;

}

}

}

uses-permission android:name="android.permission.INTERNET"/

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/