Android 애플리케이션의 빌드/버전 번호는 어떻게 얻을 수 있습니까?
안드로이드 앱의 빌드 번호를 얻거나 만드는 방법을 알아내야 합니다.UI에 표시할 빌드 번호가 필요합니다.
내가 어떻게 해야 하나요?AndroidManifest.xml
?
Gradle 플러그인/Android Studio를 사용하는 경우 버전 0.7.0 이후 버전 코드 및 버전 이름은 다음 사이트에서 정적으로 사용할 수 있습니다.BuildConfig
. 다른 패키지가 아닌 앱 패키지를 가져오십시오.BuildConfig
:
import com.yourpackage.BuildConfig;
...
int versionCode = BuildConfig.VERSION_CODE;
String versionName = BuildConfig.VERSION_NAME;
컨텍스트 개체가 필요하지 않습니다!
또, 반드시 에 그것들을 지정해 주세요.build.gradle
파일 대신AndroidManifest.xml
.
defaultConfig {
versionCode 1
versionName "1.0"
}
용도:
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
String version = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
그리고 이걸 이용해서 버전 코드를 얻을 수 있어요.
int verCode = pInfo.versionCode;
버전 이름만 원하는 경우 약간 더 짧은 버전입니다.
try{
String versionName = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return false;
}
필요한 부품은 다음 두 가지입니다.
- 안드로이드: version Code
- Android: versionName
version Code는 숫자로, 시장에 제출하는 앱의 모든 버전은 이전 버전보다 더 큰 숫자를 가져야 합니다.
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();
Gradle 및 BuildConfig 사용
BuildConfig에서 VERSION_NAME 가져오기
BuildConfig.VERSION_NAME
그래, 이제 그렇게 쉬워졌어.
VERSION_NAME에 빈 문자열을 반환하고 있습니까?
빈 문자열이 있는 경우BuildConfig.VERSION_NAME
읽어주세요.
계속 빈 끈을 받아서BuildConfig.VERSION_NAME
왜냐하면 저는 이 설정을 하지 않았기 때문입니다.versionName
내 Grade 빌드 파일에 저장(Ant에서 Gradle로 마이그레이션했습니다).그럼, 다음의 순서에 따라서, 다음의 설정을 실시해 주세요.VERSION_NAME
그래들 경유로.
파일 build.gradle
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}"
}
}
삭제 중versionName
그리고.versionCode
부터AndroidManifest.xml
그리고 당신이 설정한 이상versionName
그리고.versionCode
에서build.gradle
파일을 지금 바로, 파일로부터 파일을 삭제할 수도 있습니다.AndroidManifest.xml
파일(있는 경우)을 클릭합니다.
여기 Scottyab(사비 편집자)의 솔루션을 기반으로 한 클린 솔루션이 있습니다.사용의 메서드에 의해서 제공되지 않는 경우, 콘텍스트를 최초로 취득하는 방법을 나타냅니다.게다가 회선 마다 복수의 메서드를 호출하는 대신에, 복수의 회선을 사용합니다.이것에 의해, 애플리케이션의 디버깅이 용이하게 됩니다.
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();
}
String에서 버전 이름을 받았기 때문에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;
파일 build.gradle(앱)
defaultConfig {
applicationId "com.myapp"
minSdkVersion 19
targetSdkVersion 27
versionCode 17
versionName "1.0"
}
코틀린 외줄타기
val versionCode = BuildConfig.VERSION_CODE
val versionName = BuildConfig.VERSION_NAME
자바 원라인
String versionCode = String.valueOf(BuildConfig.VERSION_CODE);
String versionName = String.valueOf(BuildConfig.VERSION_NAME);
가져오세요.BuildConfig
아, 아, 아, 아, 아, 아, 아, 네.
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))에서는 "version Code"가 폐지되어 "long Version Code"를 사용할 수 있습니다.
Kotlin 샘플코드
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";
}
버전명 : BuildConfig.VERSION_NAME 버전코드 : BuildConfig.버전_코드
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; }
아니요, Android Manifest.xml에서는 아무것도 할 필요가 없습니다.
기본적으로 앱의 버전 이름과 버전 코드는 앱 레벨 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();
}
'아'로 .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(); }
된 「Get the generated」(생성된 「Get it from 」)
BuildConfig.java
그러나 라이브러리에서 이 값에 액세스하면 이 라이브러리를 사용하는 앱 버전이 아닌 라이브러리 버전이 반환된다는 점에 유의하십시오.따라서 비도서관 프로젝트에서만 사용하십시오!String versionName = BuildConfig.VERSION_NAME; int versionCode = BuildConfig.VERSION_CODE;
도서관 프로젝트에서 제2의 방법을 사용하는 것 외에는 몇 가지 세부 사항이 있습니다.새로운 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
단, 、 、 「 」 、 「 」 。PackageManager
수 있다0
★★★★★★★★★★★★★★★★★」null
을 않은 default
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」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();
}
Kotlin의 예:
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
}
}
언급URL : https://stackoverflow.com/questions/6593592/get-application-version-programmatically-in-android
'itsource' 카테고리의 다른 글
수집되지 않은 참조 오류:Index.html에 vue 설정을 넣을 때 Vue가 정의되지 않음 (0) | 2022.08.15 |
---|---|
vuex 스토어에서 JSON 데이터를 사용하는 방법(웹 팩 없음) (0) | 2022.08.15 |
visual studio 2017 스파 템플릿 vue js 누락 (0) | 2022.08.15 |
gcc - O0은 여전히 "미사용" 코드를 최적화합니다.그것을 변경할 수 있는 컴파일 플래그가 있습니까? (0) | 2022.08.15 |
Linux 플랫폼 드라이버와 일반 디바이스 드라이버의 차이점은 무엇입니까? (0) | 2022.08.15 |