Development/Android

안드로이드 설치된 앱 버전 읽어오기

Jamie 2020. 9. 7. 20:42
반응형

안드로이드에서 설치된 앱의 버전정보를 불러 올 일이 있었습니다.

그래서 다음과 같은 메서드를 만들어서 사용하였습니다.

버전정보(String)과 버전코드(Long)을 동시에 받기위해 Pair를 사용하였습니다.

 

public static Pair getPackageVersionInfo(final Context context, final String packageName) {
    String version = "Unknown";
    long versionCode = 0;
    PackageInfo packageInfo;


    if (context == null) {
        return null;
    }
    try {
        packageInfo = context.getApplicationContext()
                .getPackageManager()
                .getPackageInfo(packageName, 0 );
        version = packageInfo.versionName;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            versionCode = packageInfo.getLongVersionCode();
        } else {
            versionCode = (long)packageInfo.versionCode;
        }
    } catch (PackageManager.NameNotFoundException e) {
        Tool.LogE(TAG, "getVersionInfo :" + e.getMessage());
    }
    return new Pair(version, versionCode);
}

 

※ Android API 28 (Android 9 Pie) 부터는 packageInfo의 versionCode: int가 deprecated 되어있습니다.

 

그래서 이후 API를 대응하기 위해서는 getLongVersionCode를 사용해야합니다.

getLongVersionCode는 다음과 같이 구현되어있습니다.

 

/**
* Return {@link android.R.styleable#AndroidManifest_versionCode versionCode} and
* {@link android.R.styleable#AndroidManifest_versionCodeMajor versionCodeMajor} combined
* together as a single long value.  The
* {@link android.R.styleable#AndroidManifest_versionCodeMajor versionCodeMajor} is placed in
* the upper 32 bits.
*/
public long getLongVersionCode() {
    return composeLongVersionCode(versionCodeMajor, versionCode);
}

반환형이 long이므로 기존 packageInfo.versionCode도 int보다 큰 long으로 변환하여 사용하였습니다.

 

사용방법은 다음과 같습니다.

@Override
protected void onCreate(Bundle saveInstanceState) {
  String packageName = "com.testapp";
  Pair packageTuple = getPackageVersionInfo(getApplicationContext(), packageName);
  Log.d(TAG, "version: " + (String)packageTuple.first + " versionCode: " + (long)packageTuple.second);
}

 

반응형