it-swarm.asia

كيف تحصل على رقم الإصدار/الإصدار الخاص بتطبيق Android؟

أحتاج إلى معرفة كيفية الحصول على أو إنشاء رقم بناء لتطبيق Android الخاص بي. أحتاج إلى رقم البنية لعرضه في واجهة المستخدم.

هل يجب علي فعل شيء مع AndroidManifest.xml؟

1125
Fahad Ali Shaikh

استعمال:

try {
    PackageInfo pInfo = context.getPackageManager().getPackageInfo(getPackageName(), 0);
    String version = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

ويمكنك الحصول على رمز الإصدار باستخدام هذا

int verCode = pInfo.versionCode;
1922
plus-

إذا كنت تستخدم Gradle plugin/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"
}
1662
Sam Dozor

إصدار أقصر قليلاً إذا كنت تريد فقط اسم الإصدار.

String versionName = context.getPackageManager()
    .getPackageInfo(context.getPackageName(), 0).versionName;
419
scottyab

هناك جزءان تحتاجهما: Android: versionCode Android: versionName

versionCode هو رقم ، ويجب أن يكون لكل إصدار من التطبيق الذي ترسله إلى Market رقم أعلى ثم الأخير.

VersionName هو سلسلة ، ويمكن أن يكون أي شيء تريده أن يكون. هذا هو المكان الذي تحدد فيه تطبيقك على أنه "1.0" أو "2.5" أو "2 Alpha EXTREME!" أو أيا كان.

مثال:

Kotlin:

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();
152
Merkidemis

باستخدام Gradle و BuildConfig

الحصول على VERSION_NAME من BuildConfig

BuildConfig.VERSION_NAME

نعم ، الأمر بهذه السهولة الآن.

هل تعيد سلسلة فارغة إلى VERSION_NAME؟

إذا كنت تحصل على سلسلة فارغة لـ BuildConfig.VERSION_NAME ، فاقرأ عليها.

ظللت أحصل على سلسلة فارغة لـ BuildConfig.VERSION_NAME لأنني لم أقم بتعيين versionName في ملف إنشاء التقديرات (لقد قمت بالترحيل من ANT إلى Gradle). لذلك ، إليك بعض التعليمات للتأكد من أنك تقوم بتعيين VERSION_NAME عبر 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}"
  }

}

ملاحظة: هذا من المعلم جيك وارتون .

إزالة versionName و versionCode من AndroidManifest.xml

ونظرًا لأنك قمت بتعيين versionName و versionCode في ملف build.gradle الآن ، يمكنك أيضًا إزالتهما من ملف AndroidManifest.xml الخاص بك ، إذا كانا هناك.

134
Joshua Pinter
BuildConfig.VERSION_NAME //version name from your build file
BuildConfig.VERSION_CODE //version code from your build file

لا أرى حاجة للحصول عليها من مدير الحزم

73
M. Usman Khan

فيما يلي حل نظيف ، استنادًا إلى حل 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();
}

الآن بعد أن تلقيت اسم الإصدار في السلسلة myVersionName ، يمكنك ضبطه على TextView أو ما تريد ..

// set version name to a TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);
52
Michael

استخدام فئة 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"
   }
27
Velayutham M

إذا كنت تستخدم 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
    }
);

مشتقة من هنا و هنا .

23
Sean Hall

طريقة بسيطة للغاية هي:

private String appVersion = BuildConfig.VERSION_NAME;
22
android enthusiast

إليك الطريقة البسيطة للحصول على اسم الإصدار و رمز الإصدار

String version_name=BuildConfig.VERSION_NAME;
int version_code=BuildConfig.VERSION_CODE; 
16
Android Geek

لمستخدمي xamarin ، استخدم هذا الرمز للحصول على اسم الإصدار ورمزه

1) اسم الإصدار:

public string getVersionName(){
      return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionName;
}

2) رمز الإصدار:

public string getVersionCode(){
      return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionCode;
}
12
Tushar patel

إذا كنت ترغب في استخدامه على 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" />
9
Irfan Raza

فيما يلي طريقة الحصول على رمز الإصدار:

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;
}
9
Gevaria Purva

افعل ذلك دائمًا مع كتلة 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());
}
9
Pratik Butani AndroidDev

لقد حل هذا باستخدام فئة التفضيل.

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);
        }
    }
}
8
Shubham Gupta

هناك بعض الطرق للحصول على versionCode و versionName برمجيًا.

  1. الحصول على نسخة من PackageManager. هذه هي أفضل طريقة لمعظم الحالات.
try {
    String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
    int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
  1. الحصول عليها من 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 ، ولكن من 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
    }
}
7
mohax

لقد تم ذكر هذا الكود أعلاه في شكل أجزاء ولكن هنا يتم تضمينه مرة أخرى. تحتاج إلى كتلة try/catch لأنها قد تؤدي إلى "NameNotFoundException".

try {
   String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}

آمل أن يكون هذا يبسط الأشياء لشخص ما على الطريق. :)

6
Jeff.H

لا ، لست بحاجة إلى القيام بأي شيء باستخدام AndroidManifest.xml

أساسًا اسم إصدار التطبيق ورمز الإصدار داخل مستوى مستوى التطبيق ملف ، أسفل defaultConfig العلامة:

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

ملاحظة: عندما ترغب في تحميل تطبيق في playstore ، يمكن أن يعطي أي اسم كاسم إصدار ولكن يجب أن يكون رمز الإصدار مختلفًا عن رمز الإصدار الحالي إذا كان هذا التطبيق موجودًا بالفعل في متجر Play.

ما عليك سوى استخدام مقتطف الشفرة التالي للحصول على رمز الإصدار & اسم الإصدار من أي مكان في تطبيقك:

try {  
    PackageInfo pInfo =   context.getPackageManager().getPackageInfo(context.getPackageName(), 0);  
    String version = pInfo.versionName;  
    int verCode = pInfo.versionCode;  
} catch (PackageManager.NameNotFoundException e) {  
    e.printStackTrace();  
}  
6
Monir Zzaman

شخص ما لا يحتاج إلى معلومات 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";
}

تقسيم المعلومات التي تحتاجها بواسطة برنامج 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)

يرجى عذر قدرتي الإنجليزية المحدودة ، ولكن آمل أن يساعد هذا.

5
JasonChiu

بالنسبة إلى 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";
    }
4
Amir jodat

جرب هذه:

try 
{
    device_version =  getPackageManager().getPackageInfo("com.google.Android.gms", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
    e.printStackTrace();
}
4
Heenali Lakhani
 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) {

    }

  }
}
4
Durul Dalkanat
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;
        }
    }
3
Atif Mahmood

أول:

import Android.content.pm.PackageManager.NameNotFoundException;

ثم استخدم هذا:

PackageInfo pInfo = null;
try {
     pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
     e.printStackTrace();
            }
String versionName = pInfo.versionName;
3
meduvigo

مثال للاستخدام داخل شظية.

        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 usefull 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 USEFULL WITH THAT
3
Sapphire91140

نظرًا لأنه كان علي الحصول على رمز الإصدار فقط والتحقق مما إذا كان التطبيق قد تم تحديثه أم لا ، إذا كان الجواب نعم ، فقد اضطررت إلى تشغيل playstore للحصول على تحديث. فعلت بهذه الطريقة.

public class CheckForUpdate {

public static final String ACTION_APP_VERSION_CHECK="app-version-check";

public static void launchPlayStoreApp(Context context)
{

    final String appPackageName = context.getPackageName(); // getPackageName() from Context or Activity object
    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;
}

}

ثم قمت بحفظ رمز الإصدار باستخدام التفضيل المشترك عن طريق إنشاء فئة استخدام.

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 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 default  version code is 0
     }
   }
2
IP Kaal
  PackageInfo pinfo = null;
    try {
        pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    int versionNumber = pinfo.versionCode;
    String versionName = pinfo.versionName;
2
janardhan
try {
        PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        String versionName = packageInfo.versionName;
        int versionCode = packageInfo.versionCode;
        //binding.tvVersionCode.setText("v" + packageInfo.versionName);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
1
Shanmugavel GK

للحصول على كود البناء الذي يتم استخدامه لتحديد apk بواسطة كود النسخة الخاص به. يتم استخدام كود الإصدار للكشف عن التكوين الفعلي للبناء في وقت ترقية قاعدة البيانات ، والنشر ، إلخ.

int versionCode = BuildConfig.VERSION_CODE؛

يستخدم اسم الإصدار لتلبيس المستخدمين في مطوري سلسلة developmemt. يمكنك إضافة أي نوع من اسم الإصدار كما تريد

String versionName = BuildConfig.VERSION_NAME؛

0
Rohit Patil