Manifest Sürüm numarasını uygulamanın (Mizanpaj) XML değişkenlerinden nasıl alabilirsiniz?


184

Kodun ana bölümünde projenin bildiri sürüm numarası başvurmak için bir yol var istiyorum. Şimdiye kadar ne yapıyorum bir XML XML dosyasındaki sürüm numarasını manifest (@ string / Version) bağlamaktır. Ne yapmak istiyorum başka bir şekilde yapmak, bir dize XML değişkeni manifest sürümüne bağlamaktır. Sebep? Yalnızca bir konumdaki sürüm numarasını, manifest dosyasını değiştirmek istiyorum. Bunu yapmanın bir yolu var mı? Teşekkürler!


17
Bu bir kopya DEĞİLDİR. Söz konusu soru, aynı şeyi CODE'de nasıl yapacağımı sorar, XML'de soruyorum. Android programlamasında iki farklı yapı ...
PearsonArtPhoto

Yanıtlar:


367

Bunun zaten burada yanıtlandığına inanıyorum .

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

VEYA

int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;

8
Neredeyse, ama tam olarak değil ... Yapmak istediğim bir XML koduna başvurmak, ancak bu mümkün olmayabilir gibi görünüyor, bu yüzden ...
PearsonArtPhoto

Çok teşekkür ederim!!! Bunun için her yerde arıyordum:String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
Aaron Klap

1
@Shubh Ben öyle düşünmüyorum.
Konstantin Burov

3
Dereceli konuşmalar için cevabınıza BuildConfig.VERSION_NAME ekleyin.
jobbert

102

Sürümü doğrudan çıkarmanın bir yolu yoktur, ancak yapılabilecek iki çözüm vardır.

  1. Sürüm bir kaynak dizesinde saklanabilir ve manifest'e şu şekilde yerleştirilebilir:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.somepackage"
         android:versionName="@string/version" android:versionCode="20">
  2. Özel bir görünüm oluşturulabilir ve XML içine yerleştirilebilir. Görünüm, adı atamak için bunu kullanır:

    context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;

Bu çözümlerin her ikisi de sürüm adının XML'e yerleştirilmesine izin verir. Ne yazık ki böyle basit bir çözüm yok, android.R.string.versionya da bunun gibi bir şey.


14
1'e küçük bir not: çalışıyor ama bana söyleyen bir uyarı aldığım için cesaret kırıldığını düşünüyorumThe android:versionName cannot be a resource url, it must be a literal string
Griddo

1
Yaptığım şey, manifest sürüm adını el değmeden bırakmak (ancak her yeni sürümde güncelleyin) ve uygulama boyunca kullanacağım değeri saklamak için string.xml dosyasını kullanmaktır.
numediaweb

1
Çünkü AndroidStudio, bildirim dosyadaki versionNamebir set tarafından geçersiz kılınırbuild.gradle
Adrian C.

67

versionNameEtkinlik düzenleri gibi XML kaynaklarında kullanabilirsiniz . Önce app/build.gradle, androiddüğümde aşağıdaki snippet ile bir dize kaynağı oluşturun :

applicationVariants.all { variant ->
    variant.resValue "string", "versionName", variant.versionName
}

Yani tüm build.gradledosya içeriği şöyle görünebilir:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion '24.0.0 rc3'
    defaultConfig {
        applicationId 'com.example.myapplication'
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 17
        versionName '0.2.3'
        jackOptions {
            enabled true
        }
    }
    applicationVariants.all { variant ->
        variant.resValue "string", "versionName", variant.versionName
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
} 

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'com.android.support:design:23.3.0'
    compile 'com.android.support:support-v4:23.3.0'
}

Sonra @string/versionNameXML'de kullanabilirsiniz . Android Studio onu kırmızı işaretler, ancak uygulama sorunsuz derlenir. Örneğin, bu şu şekilde kullanılabilir app/src/main/res/xml/preferences.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory
        android:title="About"
        android:key="pref_key_about">

        <Preference
            android:key="pref_about_build"
            android:title="Build version"
            android:summary="@string/versionName" />

    </PreferenceCategory>


</PreferenceScreen>


3
Bu programlı üsluptan daha iyidir.
Nörotransmiter

2
Harika bir çözüm. Bir ton teşekkürler.
Samik Bandyopadhyay

2
En son kullanıyorum ve hala benim için çalışıyor. Bunu ve bunun gibi başka değişkenleri kullanıyorum. @ k2col derleme sırasında ne hata alıyorsunuz? Pls not ortağı sonrası sonrası
Arun Shankar

3
Bu en iyi cevap olarak düşünülmelidir.
pepan

15

Bu sorunu Tercih sınıfını genişleterek çözdüm.

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);
        }
    }
}

Sonra tercihlerimde XML:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <com.example.android.VersionPreference android:title="Version" />
</PreferenceScreen>

Hata. Başka bir yoruma dayalı XML tercih düşünüyor olmalıydım.
seastland

Yine de cevabını kopyalayıp yapıştıracağım.
Mathijs Segers

13

Ben kullanıyorum BuildConfig.VERSION_NAME.toString();. Bunun ve packageManager'dan alması arasındaki fark nedir?

Üzgünüm, XML tabanlı hiçbir çözüm işe yaramadı.


7
BuildConfig.VERSION_NAME zaten bir dizedir, üzerindeString () öğesini çağırmaya gerek yoktur.
Makotosan

Alışkanlık. Yeterince adil
Mullazman

Projenizde bunu çağırdığınızda beklediğinizden farklı sonuç alabilirsiniz. Örneğin, projenizde bir android alt modülü kullanırsanız ve alt modülün kodundan çağırırsanız, farklı versiyona sahip olabilecek alt modülün yapılandırmasını referans gösterecektir. Ya da projenizin kodundan çağırırsanız, alt modülünüzün yapılandırmasını oluşturmak ve aynı sonucu elde etmek için yanlışlıkla başvurabilirsiniz. Sadece dikkatli olun ve derleme yapılandırmasının uygun paketine başvurduğunuzdan emin olun.
MikeL

Bu kılavuzu kullanmayı deneyin: medium.com/@manas/…
CrandellWS

fark BuilConfig Gradle tarafından sağlanırken çalışma zamanında almak PackageManager (OS) tarafından sağlanıyor
Ishaan Kumar

12

Gradle kullanıyorsanız, derleme zamanında xml kaynaklarına programsal olarak değer eklemek için build.gradle dosyasını kullanabilirsiniz.

Örnek Kod: https://medium.com/@manas/manage-your-android-app-s-versioncode-versionname-with-gradle-7f9c5dcf09bf

buildTypes {
    debug {
        versionNameSuffix ".debug"
        resValue "string", "app_version", "${defaultConfig.versionName}${versionNameSuffix}"
    }
    release {
        resValue "string", "app_version", "${defaultConfig.versionName}"
    }
}

şimdi @string/app_versionXML'de gerektiği gibi kullanın

.debugHata ayıklama modundayken bağlı makalede açıklandığı gibi sürüm adına eklenir .


1
en iyi cevap !!
Raheel Hasan

2

XML'den kullanamazsınız.

XML'de kullandığınız widget'ı genişletmeniz ve Konstantin Burov'un cevabında belirtilenleri kullanarak metni ayarlamak için mantığı eklemeniz gerekir.


Bundan korkuyordum ... Yardımın için teşekkürler!
PearsonArtPhoto

2
kullanabiliriz. lütfen cevabımı kontrol et. Ben benim app kullanıyorum
Arun Shankar

1

En kolay çözüm kullanmaktır BuildConfig.

Kullandığım BuildConfig.VERSION_NAMEbaşvurumu.

BuildConfig.VERSION_CODESürüm kodunu almak için de kullanabilirsiniz .


-3

Oyunun sonlarına doğru, ama bunu @string/xyzkullanmadan yapabilirsiniz?android:attr

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="?android:attr/versionName"
     />
    <!-- or -->
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="?android:attr/versionCode"
     />

11
Şöyle kullanıyorum: <Preference android:title="Version" android:summary="?android:attr/versionName" ></Preference>ama göster. ?16843292Yanlış olan ne?
Suge

Emin değilim ama bu sonraki API's için olduğunu düşünüyorum?
Mafro34

@PearsonArtPhoto aslında, bunu nerede söylüyor?
Mafro34

çalışmıyor; @Suge yukarıda işaret etti komik sayı döndürür
pepan

hiç çalışmıyor ve daha önce yayınlandığı gibi rastgele değer döndürüyor
A_rmas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.