Fah*_*ikh 1198 android android-manifest android-emulator
我需要弄清楚如何为我的Android应用程序获取或制作内部版本号.我需要在UI中显示内部版本号.
我必须做点什么AndroidManifest.xml
吗?
plu*_*us- 1975
使用:
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(getPackageName(), 0);
String version = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
您可以使用此方法获取版本代码
int verCode = pInfo.versionCode;
Run Code Online (Sandbox Code Playgroud)
Sam*_*zor 1790
如果您使用的是Gradle插件/ Android Studio,则从版本0.7.0开始,版本代码和版本名称可以静态使用BuildConfig
.确保导入应用程序的包,而不是另一个BuildConfig
:
import com.yourpackage.BuildConfig;
...
int versionCode = BuildConfig.VERSION_CODE;
String versionName = BuildConfig.VERSION_NAME;
Run Code Online (Sandbox Code Playgroud)
不需要Context对象!
另外,请确保在build.gradle
文件中指定它们而不是AndroidManifest.xml
.
defaultConfig {
versionCode 1
versionName "1.0"
}
Run Code Online (Sandbox Code Playgroud)
sco*_*yab 425
如果您只想要版本名称,则稍微缩短版本.
String versionName = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0).versionName;
Run Code Online (Sandbox Code Playgroud)
Mer*_*mis 164
你需要两个部分:android:versionCode android:versionName
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)
Run Code Online (Sandbox Code Playgroud)
Java的:
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();
Run Code Online (Sandbox Code Playgroud)
Jos*_*ter 142
BuildConfig.VERSION_NAME
Run Code Online (Sandbox Code Playgroud)
是的,现在就这么简单.
如果你得到一个空字符串,BuildConfig.VERSION_NAME
那么请继续阅读.
我一直得到一个空字符串,BuildConfig.VERSION_NAME
因为我没有设置versionName
我的成绩构建文件(我从ANT迁移到Gradle).因此,以下是确保您设置VERSION_NAME
via Gradle的说明.
的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}"
}
}
Run Code Online (Sandbox Code Playgroud)
注意:这是来自杰出的杰克沃顿.
versionName
并versionCode
从AndroidManifest.xml
既然你已经设置的versionName
,并versionCode
在在build.gradle
现在的文件,你也可以从你删除这些AndroidManifest.xml
文件,如果它们的存在.
Mic*_*ael 54
这是一个基于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();
}
Run Code Online (Sandbox Code Playgroud)
现在您已在String中收到版本名称myVersionName
,您可以将其设置为TextView或您喜欢的任何内容.
// set version name to a TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);
Run Code Online (Sandbox Code Playgroud)
Vel*_*m M 30
使用BuildConfig类
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;
Run Code Online (Sandbox Code Playgroud)
的build.gradle(APP)
defaultConfig {
applicationId "com.myapp"
minSdkVersion 19
targetSdkVersion 27
versionCode 17
versionName "1.0"
}
Run Code Online (Sandbox Code Playgroud)
Gas*_*lén 25
val versionCode = BuildConfig.VERSION_CODE
val versionName = BuildConfig.VERSION_NAME
Run Code Online (Sandbox Code Playgroud)
确保导入BuildConfig
到您的类中。
String versionCode = String.valueOf(BuildConfig.VERSION_CODE);
String versionName = String.valueOf(BuildConfig.VERSION_NAME);
Run Code Online (Sandbox Code Playgroud)
Sea*_*all 23
如果您正在使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
在plugins.xml中,添加以下行:
<plugin name="PackageManagerPlugin" value="com.Demo.PackageManagerPlugin" />
Run Code Online (Sandbox Code Playgroud)
在您的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());
});
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过执行以下操作获取versionName属性:
window.plugins.packageManager.getVersionName(
function(versionName) {
//do something with versionName
},
function(errorMessage) {
//do something with errorMessage
}
);
Run Code Online (Sandbox Code Playgroud)
Ric*_*rdo 23
这个问题有两种不同的情况,任何答案都没有正确解决。
如果您不使用模块,您可以访问您的 BuildConfig 文件并立即获取版本代码:
val versionCode = BuildConfig.VERSION_CODE
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为这是您的应用程序级别的 BuildConfig 文件,因此它将包含对您的应用程序版本代码的引用
您拥有许多具有给定层次结构的模块是正常的,例如应用程序 - >数据 - >域 - > ui等。在这种情况下,如果您从“ui”模块访问BuildConfig文件,它不会给您一个引用应用程序版本代码,但引用该模块的版本代码。
为了获取应用程序版本代码,您可以使用以下给定代码:
首先是一个扩展函数来获取PackageInfo
@Suppress("DEPRECATION")
fun Context.getPackageInfo(): PackageInfo {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
packageManager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(0))
} else {
packageManager.getPackageInfo(packageName, 0)
}
}
Run Code Online (Sandbox Code Playgroud)
获取版本号的扩展函数
fun Context.getVersionCode(): Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
getPackageInfo().longVersionCode.toInt()
} else {
getPackageInfo().versionCode
}
Run Code Online (Sandbox Code Playgroud)
版本名称的方法类似:
fun Context.getVersionName(): String = try {
getPackageInfo().versionName
} catch (e: PackageManager.NameNotFoundException) {
""
}
Run Code Online (Sandbox Code Playgroud)
小智 19
获取应用版本或用于通过其版本代码标识apk的构建代码。版本代码用于在更新,发布等时检测实际的构建配置。
int versionCode = BuildConfig.VERSION_CODE;
Run Code Online (Sandbox Code Playgroud)
版本名称用于显示开发顺序的用户或开发人员。您可以根据需要添加任何版本名称
String versionName = BuildConfig.VERSION_NAME;
Run Code Online (Sandbox Code Playgroud)
May*_*rma 19
与 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
}
Run Code Online (Sandbox Code Playgroud)
Tus*_*tel 12
对于xamarin用户,请使用此代码获取版本名称和代码
1)版本名称:
public string getVersionName(){
return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionName;
}
Run Code Online (Sandbox Code Playgroud)
2)版本代码:
public string getVersionCode(){
return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionCode;
}
Run Code Online (Sandbox Code Playgroud)
Irf*_*aza 11
如果要在xml上使用它,请在gradle文件中添加以下行:
applicationVariants.all { variant ->
variant.resValue "string", "versionName", variant.versionName
}
Run Code Online (Sandbox Code Playgroud)
然后在你的xml上使用它,如下所示:
<TextView
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/versionName" />
Run Code Online (Sandbox Code Playgroud)
Mon*_*man 11
基本上,您的应用的版本名称和版本代码位于应用级别gradle文件中的defaultConfig标签下:
defaultConfig {
versionCode 1
versionName "1.0"
}
Run Code Online (Sandbox Code Playgroud)
注意:当您希望在Play商店中上传应用时,可以使用任何名称作为版本名称,但是如果此应用已在Play商店中,则该版本代码必须与当前版本代码不同。
只需使用以下代码段即可从应用程序中的任何位置获取版本代码和版本名称:
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
String version = pInfo.versionName;
int verCode = pInfo.versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
总是用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());
}
Run Code Online (Sandbox Code Playgroud)
以下是获取版本代码的方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
对于Api 28,不推荐使用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";
}
Run Code Online (Sandbox Code Playgroud)
小智 8
我通过使用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有一些方法可以获得versionCode
和versionName
编程.
PackageManager
.这是大多数情况下的最佳方式.try {
String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
BuildConfig.java
.但请注意,如果您将在库中访问此值,它将返回使用此库的库版本,而不是应用程序之一.所以只在非库项目中使用!String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;
Run Code Online (Sandbox Code Playgroud)
除了在库项目中使用第二种方式外,还有一些细节.在新的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
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将正确设置值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
}
}
Run Code Online (Sandbox Code Playgroud)
上面提到了这段代码,但是这里再次包括在内.你需要一个try/catch块,因为它可能抛出一个"NameNotFoundException".
try {
String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}
Run Code Online (Sandbox Code Playgroud)
我希望这能为后来的人简化事情.:)
小智 5
但是,不需要应用程序UI的BuildConfig信息的人想要使用这些信息来设置CI作业配置或其他人,比如我.
只要您成功构建项目,就会在项目目录下有一个自动生成的文件BuildConfig.java.
{WORKSPACE} /建立/生成/源极/ buildConfig/{调试|释放}/{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";
}
Run Code Online (Sandbox Code Playgroud)
通过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)
Run Code Online (Sandbox Code Playgroud)
请原谅我有限的英语能力,但希望这会有所帮助.
归档时间: |
|
查看次数: |
552257 次 |
最近记录: |