내 Android 애플리케이션의 빌드 번호를 얻거나 만드는 방법을 알아야 합니다. UI에 표시할 빌드 번호가 필요합니다.
AndroidManifest.xml
뭔가를 해야 합니까?
질문자 :Fahad Ali Shaikh
내 Android 애플리케이션의 빌드 번호를 얻거나 만드는 방법을 알아야 합니다. UI에 표시할 빌드 번호가 필요합니다.
AndroidManifest.xml
뭔가를 해야 합니까?
사용하다:
try { PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); String version = pInfo.versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }
그리고 이것을 사용하여 버전 코드를 얻을 수 있습니다
int verCode = pInfo.versionCode;
Gradle 플러그인/Android Studio를 사용하는 경우 버전 0.7.0 부터 버전 코드와 버전 이름을 BuildConfig
에서 정적으로 사용할 수 있습니다. 다른 BuildConfig
아닌 앱의 패키지를 가져와야 합니다 .
import com.yourpackage.BuildConfig; ... int versionCode = BuildConfig.VERSION_CODE; String versionName = BuildConfig.VERSION_NAME;
컨텍스트 개체가 필요하지 않습니다!
AndroidManifest.xml
대신 build.gradle
파일에 지정해야 합니다.
defaultConfig { versionCode 1 versionName "1.0" }
버전 이름만 원하는 경우 약간 더 짧은 버전입니다.
try{ String versionName = context.getPackageManager() .getPackageInfo(context.getPackageName(), 0).versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return false; }
필요한 두 부분이 있습니다.
versionCode는 숫자이며 시장에 제출하는 모든 앱 버전은 마지막 버전보다 더 높은 숫자를 가져야 합니다.
VersionName은 문자열이며 원하는 모든 것이 될 수 있습니다. 여기에서 앱을 "1.0" 또는 "2.5" 또는 "2 Alpha EXTREME!"로 정의합니다. 또는 무엇이든.
예시:
코틀린:
val manager = this.packageManager val info = manager.getPackageInfo(this.packageName, PackageManager.GET_ACTIVITIES) toast("PackageName = " + info.packageName + "\nVersionCode = " + info.versionCode + "\nVersionName = " + info.versionName + "\nPermissions = " + info.permissions)
자바:
PackageManager manager = this.getPackageManager(); PackageInfo info = manager.getPackageInfo(this.getPackageName(), PackageManager.GET_ACTIVITIES); Toast.makeText(this, "PackageName = " + info.packageName + "\nVersionCode = " + info.versionCode + "\nVersionName = " + info.versionName + "\nPermissions = " + info.permissions, Toast.LENGTH_SHORT).show();
BuildConfig.VERSION_NAME
네, 이제 쉽습니다.
BuildConfig.VERSION_NAME
대해 빈 문자열이 표시되면 계속 읽으십시오.
내 Grade 빌드 파일에서 versionName
을 설정하지 않았기 때문에 BuildConfig.VERSION_NAME
에 대해 계속 빈 문자열을 얻었습니다 (Ant 에서 Gradle로 마이그레이션했습니다). 따라서 Gradle을 통해 VERSION_NAME
을 설정하고 있는지 확인하는 방법은 다음과 같습니다.
def versionMajor = 3 def versionMinor = 0 def versionPatch = 0 def versionBuild = 0 // Bump for dogfood builds, public betas, etc. android { defaultConfig { versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild versionName "${versionMajor}.${versionMinor}.${versionPatch}" } }
참고: 이것은 뛰어난 Jake Wharton의 것 입니다.
AndroidManifest.xml
에서 versionName
및 versionCode
제거 build.gradle
파일에 versionName
및 versionCode
를 설정 AndroidManifest.xml
파일이 있는 경우 이를 제거할 수도 있습니다.
다음은 scottyab(Xavi 편집) 솔루션을 기반으로 하는 깨끗한 솔루션입니다. 메서드에서 컨텍스트를 제공하지 않는 경우 컨텍스트를 먼저 가져오는 방법을 보여줍니다. 또한 한 줄에 여러 메서드를 호출하는 대신 여러 줄을 사용합니다. 이렇게 하면 애플리케이션을 디버그해야 할 때 더 쉽게 할 수 있습니다.
Context context = getApplicationContext(); // or activity.getApplicationContext() PackageManager packageManager = context.getPackageManager(); String packageName = context.getPackageName(); String myVersionName = "not available"; // initialize String try { myVersionName = packageManager.getPackageInfo(packageName, 0).versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }
myVersionName
에서 버전 이름을 받았으므로 TextView 또는 원하는 대로 설정할 수 있습니다.
// Set the version name to a TextView TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName); tvVersionName.setText(myVersionName);
다음을 사용하여 버전 코드로 APK 파일을 식별하는 데 사용되는 앱 버전 또는 빌드 코드를 가져옵니다. 버전 코드는 업데이트, 게시 등의 시점에서 실제 빌드 구성을 감지하는 데 사용됩니다.
int versionCode = BuildConfig.VERSION_CODE;
버전 이름은 개발 시퀀스의 사용자 또는 개발자를 표시하는 데 사용됩니다. 원하는 대로 모든 종류의 버전 이름을 추가할 수 있습니다.
String versionName = BuildConfig.VERSION_NAME;
BuildConfig 클래스를 사용합니다.
String versionName = BuildConfig.VERSION_NAME; int versionCode = BuildConfig.VERSION_CODE;
defaultConfig { applicationId "com.myapp" minSdkVersion 19 targetSdkVersion 27 versionCode 17 versionName "1.0" }
val versionCode = BuildConfig.VERSION_CODE val versionName = BuildConfig.VERSION_NAME
BuildConfig
를 클래스로 가져와야 합니다.
String versionCode = String.valueOf(BuildConfig.VERSION_CODE); String versionName = String.valueOf(BuildConfig.VERSION_NAME);
PhoneGap을 사용하는 경우 사용자 정의 PhoneGap 플러그인을 만듭니다.
앱 패키지에 새 클래스를 만듭니다.
package com.Demo; //replace with your package name import org.json.JSONArray; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import com.phonegap.api.Plugin; import com.phonegap.api.PluginResult; import com.phonegap.api.PluginResult.Status; public class PackageManagerPlugin extends Plugin { public final String ACTION_GET_VERSION_NAME = "GetVersionName"; @Override public PluginResult execute(String action, JSONArray args, String callbackId) { PluginResult result = new PluginResult(Status.INVALID_ACTION); PackageManager packageManager = this.ctx.getPackageManager(); if(action.equals(ACTION_GET_VERSION_NAME)) { try { PackageInfo packageInfo = packageManager.getPackageInfo( this.ctx.getPackageName(), 0); result = new PluginResult(Status.OK, packageInfo.versionName); } catch (NameNotFoundException nnfe) { result = new PluginResult(Status.ERROR, nnfe.getMessage()); } } return result; } }
plugins.xml에서 다음 행을 추가하십시오.
<plugin name="PackageManagerPlugin" value="com.Demo.PackageManagerPlugin" />
deviceready 이벤트 에서 다음 코드를 추가합니다.
var PackageManagerPlugin = function() { }; PackageManagerPlugin.prototype.getVersionName = function(successCallback, failureCallback) { return PhoneGap.exec(successCallback, failureCallback, 'PackageManagerPlugin', 'GetVersionName', []); }; PhoneGap.addConstructor(function() { PhoneGap.addPlugin('packageManager', new PackageManagerPlugin()); });
그런 다음 다음을 수행하여 versionName 속성을 가져올 수 있습니다.
window.plugins.packageManager.getVersionName( function(versionName) { //do something with versionName }, function(errorMessage) { //do something with errorMessage } );
2020년과 마찬가지로: API 28( Android 9 (Pie))부터 "versionCode"는 더 이상 사용되지 않으므로 "longVersionCode" 를 사용할 수 있습니다.
val manager = context?.packageManager val info = manager?.getPackageInfo( context?.packageName, 0 ) val versionName = info?.versionName val versionNumber = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { info?.longVersionCode } else { info?.versionCode }
API 28( Android 9 (Pie))의 경우 PackageInfo.versionCode가 더 이상 사용되지 않으므로 아래 코드를 사용하세요.
Context context = getApplicationContext(); PackageManager manager = context.getPackageManager(); try { PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0); myversionName = info.versionName; versionCode = (int) PackageInfoCompat.getLongVersionCode(info); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); myversionName = "Unknown-01"; }
XML 콘텐츠에서 사용하려면 Gradle 파일에 아래 줄을 추가하세요.
applicationVariants.all { variant -> variant.resValue "string", "versionName", variant.versionName }
그런 다음 다음과 같이 XML 콘텐츠에 사용합니다.
<TextView android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/versionName" />
Xamarin 사용자의 경우 이 코드를 사용하여 버전 이름 및 코드를 가져옵니다.
버전 이름:
public string getVersionName(){ return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionName; }
버전 코드:
public string getVersionCode(){ return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionCode; }
기본적으로 앱의 버전 이름과 버전 코드는 앱 수준 Gradle 파일의 defaultConfig 태그 아래에 있습니다.
defaultConfig { versionCode 1 versionName "1.0" }
참고: 앱을 플레이 스토어에 업로드하려는 경우 버전 이름으로 아무 이름이나 지정할 수 있지만 이 앱이 이미 플레이 스토어에 있는 경우 버전 코드는 현재 버전 코드와 달라야 합니다.
다음 코드 스니펫을 사용 하여 앱 어디에서나 버전 코드 및 버전 이름을 가져오기만 하면 됩니다.
try { PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); String version = pInfo.versionName; int verCode = pInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }
버전 이름 : BuildConfig.VERSION_NAME 버전 코드 : BuildConfig.VERSION_CODE
항상 try catch
블록으로 수행하십시오.
String versionName = "Version not found"; try { versionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; Log.i(TAG, "Version Name: " + versionName); } catch (NameNotFoundException e) { // TODO Auto-generated catch block Log.e(TAG, "Exception Version Name: " + e.getLocalizedMessage()); }
버전 코드를 가져오는 방법은 다음과 같습니다.
public String getAppVersion() { String versionCode = "1.0"; try { versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; } catch (PackageManager.NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return versionCode; }
Preference 클래스를 사용하여 이 문제를 해결했습니다.
package com.example.android; import android.content.Context; import android.preference.Preference; import android.util.AttributeSet; public class VersionPreference extends Preference { public VersionPreference(Context context, AttributeSet attrs) { super(context, attrs); String versionName; final PackageManager packageManager = context.getPackageManager(); if (packageManager != null) { try { PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); versionName = packageInfo.versionName; } catch (PackageManager.NameNotFoundException e) { versionName = null; } setSummary(versionName); } } }
프로그래밍 versionCode
및 versionName
을 가져오는 몇 가지 방법이 있습니다.
PackageManager
에서 버전을 가져옵니다. 이것은 대부분의 경우에 가장 좋은 방법입니다.
try { String versionName = packageManager.getPackageInfo(packageName, 0).versionName; int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }
BuildConfig.java
에서 가져옵니다. 그러나 라이브러리에서 이 값에 액세스하면 이 라이브러리를 사용하는 앱 버전이 아닌 라이브러리 버전이 반환됩니다. 따라서 라이브러리가 아닌 프로젝트에서만 사용하십시오!
String versionName = BuildConfig.VERSION_NAME; int versionCode = BuildConfig.VERSION_CODE;
라이브러리 프로젝트에서 두 번째 방법을 사용하는 것을 제외하고 몇 가지 세부 사항이 있습니다. 새로운 Android Gradle 플러그인(3.0.0 이상)에서 일부 기능이 제거되었습니다 . 따라서 지금은 다른 맛에 대해 다른 버전을 설정하는 것이 제대로 작동하지 않습니다.
잘못된 방법:
applicationVariants.all { variant -> println('variantApp: ' + variant.getName()) def versionCode = {SOME_GENERATED_VALUE_IE_TIMESTAMP} def versionName = {SOME_GENERATED_VALUE_IE_TIMESTAMP} variant.mergedFlavor.versionCode = versionCode variant.mergedFlavor.versionName = versionName }
위의 코드는 BuildConfig
에서 default
구성에서 버전을 설정하지 않은 경우 PackageManager
0
과 null
수신합니다. 따라서 앱의 기기 버전 코드 0
해결 방법이 있습니다 - 출력 apk
파일의 버전을 수동으로 설정하십시오.
applicationVariants.all { variant -> println('variantApp: ' + variant.getName()) def versionCode = {SOME_GENERATED_VALUE_IE_TIMESTAMP} def versionName = {SOME_GENERATED_VALUE_IE_TIMESTAMP} variant.outputs.all { output -> output.versionCodeOverride = versionCode output.versionNameOverride = versionName } }
이 코드는 위에서 부분적으로 언급되었지만 여기에 다시 모두 포함됩니다. "NameNotFoundException"이 발생할 수 있으므로 try/catch 블록이 필요합니다.
try { String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }
이것이 누군가를 위해 일을 단순화하기를 바랍니다. :)
응용 프로그램의 UI에 대한 BuildConfig 정보가 필요하지 않지만 나처럼 CI 작업 구성 또는 다른 사람을 설정하는 데 이 정보를 사용하려는 사람을 위해:
프로젝트를 성공적으로 빌드하는 한 프로젝트 디렉토리 아래에 자동으로 생성된 파일 BuildConfig.java가 있습니다.
{WORKSPACE}/build/generated/source/buildConfig/{debug|release}/{PACKAGE}/BuildConfig.java
/** * Automatically generated file. DO NOT MODIFY */ package com.XXX.Project; public final class BuildConfig { public static final boolean DEBUG = Boolean.parseBoolean("true"); public static final String APPLICATION_ID = "com.XXX.Project"; public static final String BUILD_TYPE = "debug"; public static final String FLAVOR = ""; public static final int VERSION_CODE = 1; public static final String VERSION_NAME = "1.0.0"; }
Python 스크립트 또는 기타 도구로 필요한 정보를 분할합니다. 다음은 예입니다.
import subprocess # Find your BuildConfig.java _BuildConfig = subprocess.check_output('find {WORKSPACE} -name BuildConfig.java', shell=True).rstrip() # Get the version name _Android_version = subprocess.check_output('grep -n "VERSION_NAME" ' + _BuildConfig, shell=True).split('"')[1] print('Android version: ' + _Android_version)
package com.sqisland.android.versionview; import android.app.Activity; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textViewversionName = (TextView) findViewById(R.id.text); try { PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0); textViewversionName.setText(packageInfo.versionName); } catch (PackageManager.NameNotFoundException e) { } } }
이걸로 해봐:
try { device_version = getPackageManager().getPackageInfo("com.google.android.gms", 0).versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }
코틀린 예시:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.act_signin) packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES).apply { findViewById<TextView>(R.id.text_version_name).text = versionName findViewById<TextView>(R.id.text_version_code).text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) "$longVersionCode" else "$versionCode" } packageManager.getApplicationInfo(packageName, 0).apply{ findViewById<TextView>(R.id.text_build_date).text = SimpleDateFormat("yy-MM-dd hh:mm").format(java.io.File(sourceDir).lastModified()) } }
첫 번째:
import android.content.pm.PackageManager.NameNotFoundException;
그런 다음 이것을 사용하십시오.
PackageInfo pInfo = null; try { pInfo = getPackageManager().getPackageInfo(getPackageName(), 0); } catch (NameNotFoundException e) { e.printStackTrace(); } String versionName = pInfo.versionName;
private String GetAppVersion() { try { PackageInfo _info = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0); return _info.versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return ""; } } private int GetVersionCode() { try { PackageInfo _info = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0); return _info.versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return -1; } }
내부 프래그먼트 사용의 예.
import android.content.pm.PackageManager; ....... private String VersionName; private String VersionCode; ....... Context context = getActivity().getApplicationContext(); /* Getting application version name and code */ try { VersionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; /* I find it useful to convert vervion code into String, so it's ready for TextViev/server side checks */ VersionCode = Integer.toString(context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } // Do something useful with that
PackageInfo pinfo = null; try { pinfo = getPackageManager().getPackageInfo(getPackageName(), 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } int versionNumber = pinfo.versionCode; String versionName = pinfo.versionName;
버전 코드만 가져와서 앱이 업데이트되었는지 여부를 확인해야 했기 때문에 업데이트된 앱을 업데이트하려면 플레이스토어를 실행해야 했습니다. 나는 이렇게 했다.
public class CheckForUpdate { public static final String ACTION_APP_VERSION_CHECK = "app-version-check"; public static void launchPlayStoreApp(Context context) { // getPackageName() from Context or Activity object final String appPackageName = context.getPackageName(); try { context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName))); } catch (android.content.ActivityNotFoundException anfe) { context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName))); } } public static int getRemoteVersionNumber(Context context) { int versionCode = 0; try { PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); String version = pInfo.versionName; versionCode = pInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return versionCode; } }
그런 다음 util 클래스를 만들어 공유 기본 설정을 사용하여 버전 코드를 저장했습니다.
public class PreferenceUtils { // This is for version code private final String APP_VERSION_CODE = "APP_VERSION_CODE"; private SharedPreferences sharedPreferencesAppVersionCode; private SharedPreferences.Editor editorAppVersionCode; private static Context mContext; public PreferenceUtils(Context context) { this.mContext = context; // This is for the app versioncode sharedPreferencesAppVersionCode = mContext.getSharedPreferences(APP_VERSION_CODE,MODE_PRIVATE); editorAppVersionCode = sharedPreferencesAppVersionCode.edit(); } public void createAppVersionCode(int versionCode) { editorAppVersionCode.putInt(APP_VERSION_CODE, versionCode); editorAppVersionCode.apply(); } public int getAppVersionCode() { return sharedPreferencesAppVersionCode.getInt(APP_VERSION_CODE,0); // As the default version code is 0 } }
출처 : http:www.stackoverflow.com/questions/4616095/how-can-you-get-the-build-version-number-of-your-android-application
'정적 읽기 전용' 대 'const' (0) | 2022.03.04 |
---|---|
"python -m SimpleHTTPServer"에 해당하는 Python 3은 무엇입니까? (0) | 2022.03.04 |
SQL Server에서 JOIN으로 UPDATE 문을 수행하려면 어떻게 해야 합니까? (0) | 2022.03.04 |
instanceof를 호출하기 전에 null 검사가 필요합니까? (0) | 2022.03.04 |
jQuery Ajax 호출 후 리디렉션 요청을 관리하는 방법 (0) | 2022.03.04 |