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”/

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/296267.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-27 12:58
下一篇 2024-12-27 12:58

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論