11

Android のバージョン名は String データ型であるため、デバイス上の既存の apk を新しい apk 更新バージョン名と比較したいと考えています。プログラムでバージョン名を取得する方法を知っており、2 つのバージョン名がありますが、2 つのバージョン名間の文字列比較で正しい結果が表示されません

if ( oldVersionName.compareTo( newVersionName ) < 0 ) {
}

この compareTo は、1.0.9 と 1.0.12、1.0.9 と 1.0.10 などのいくつかのシナリオでは機能しません。

2 つの文字列バージョン名をプログラムで比較する方法を教えてください。ありがとうございました!

4

11 に答える 11

24

を使用して、Android バージョンの「int 形式」を取得できます。

 Build.VERSION.SDK_INT

とにかく、「ドット表記」のバージョン名しかない場合は、split「。」で文字列を指定できます。char を繰り返し、部分ごとに比較します。頭のてっぺんから、それは次のようになります.-

public int compareVersionNames(String oldVersionName, String newVersionName) {
    int res = 0;

    String[] oldNumbers = oldVersionName.split("\\.");
    String[] newNumbers = newVersionName.split("\\.");

    // To avoid IndexOutOfBounds
    int maxIndex = Math.min(oldNumbers.length, newNumbers.length);

    for (int i = 0; i < maxIndex; i ++) {
        int oldVersionPart = Integer.valueOf(oldNumbers[i]);
        int newVersionPart = Integer.valueOf(newNumbers[i]);

        if (oldVersionPart < newVersionPart) {
            res = -1;
            break;
        } else if (oldVersionPart > newVersionPart) {
            res = 1;
            break;
        }
    }

    // If versions are the same so far, but they have different length...
    if (res == 0 && oldNumbers.length != newNumbers.length) {
        res = (oldNumbers.length > newNumbers.length)?1:-1;
    }

    return res;
}

試しずに書いただけなので、最適化できるのは確かですが、スタートです。

于 2013-09-09T13:44:56.367 に答える
0

ではAndroidManifest.xml、整数のversionCodeと文字列のversionNameを指定する必要があります。どちらの値も実行時に取得できるため、アプリのバージョンを比較するversionCode代わりに使用する必要があります。versionName

独自のアプリのを取得する場合versionCodeは、次のコードを使用できます。

public static int getAppVersionCode(Context context) {
    PackageInfo packageInfo = getPackageInfo(context);
    return packageInfo.versionCode;
}

private static PackageInfo getPackageInfo(Context context) {
    try {
        return context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
    }
    catch (NameNotFoundException e) {
        throw new IllegalStateException(e);
    }
}

他のアプリのバージョン コードは、正しいパッケージ名を指定することで取得できます。

于 2013-09-09T14:48:54.807 に答える
0

次のコードでこの問題を解決しました。

    String VERSION_TO_COMPARE = "1.2.3"   

    try {

        //get current Version Code
        PackageManager manager = this.getPackageManager();
        PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
        String currentVersionName = info.versionName;

        if(!VERSION_TO_COMPARE.equals(currentVersionName)){
            //version string not the same, version is NOT up to date

            Boolean updateNeeded = false;
            String[] currentVersionCodeArray = currentVersionName.split("\\.");
            String[] storeVersionCodeArray = VERSION_TO_COMPARE.split("\\.");

            int maxLength = currentVersionCodeArray.length;
            if(storeVersionCodeArray.length > maxLength){
                maxLength = storeVersionCodeArray.length;
            }

            for (int i = 0; i < maxLength; i++){

                try{
                    if(Integer.parseInt(storeVersionCodeArray[i]) > Integer.parseInt(currentVersionCodeArray[i])){
                        updateNeeded = true;
                        continue;
                    }
                }
                catch(IndexOutOfBoundsException e){
                    //store version code length > current version length = version needs to be updated
                    //if store version length is shorter, the if-statement already did the job
                    if(storeVersionCodeArray.length > currentVersionCodeArray.length){
                        updateNeeded = true;
                    }
                }


            }

            if(updateNeeded){
                //current version of app, lower than VERSION_TO_COMPARE
                //do sth. in our case, show an update-dialog
            }

        }
        else{
            //do nothing: version is up to date
        }

    } catch (PackageManager.NameNotFoundException e){
        e.printStackTrace();
    }
于 2015-07-09T07:42:29.580 に答える