Android - Як отримати ім’я програми? (Не назва пакета)


120

У своєму маніфесті я маю:

  <application
    android:name=".MyApp"
    android:icon="@drawable/ic_launcher_icon"
    android:label="@string/app_name"
    android:debuggable="true">

Як отримати елемент мітки?

Примітка. Мій код працює всередині чужого, тому я не маю доступу до @ string / app_name

Відповіді:


182

Існує простіший спосіб, ніж інші відповіді, який не вимагає від вас чітко називати ресурс або турбуватися про винятки з іменами пакунків. Він також працює, якщо ви використовували рядок безпосередньо замість ресурсу.

Просто зробіть:

public static String getApplicationName(Context context) {
    ApplicationInfo applicationInfo = context.getApplicationInfo();
    int stringId = applicationInfo.labelRes;
    return stringId == 0 ? applicationInfo.nonLocalizedLabel.toString() : context.getString(stringId);
}

Сподіваюся, це допомагає.

Редагувати

У світлі коментаря Snicolas я змінив вище, щоб він не намагався вирішити ідентифікатор, якщо він дорівнює 0. Натомість він використовує nonLocalizedLabelяк backoff. Немає необхідності в упаковці в спробу / ловити.


3
Це добре працює, якщо ви дійсно використовуєте етикетку в android:name. Якщо ви жорстко закодували рядок, то вона виходить з ладу.
Snicolas

2
Щоправда, але назва програми, як правило, вказується звичайно через рядовий ресурс. Жорстко провідна струна позначена ворсом і не рекомендується.
darrenp

1
Просто будьте обережні, що він викине android.content.res.Resources $ NotFoundException, якщо рядок не буде знайдено
zenocon

Як радить zenocon, краще покласти його всередину а try ... catch .
superarts.org

Чи знаєте ви щось про docu програми nonLocalizableLabel ?: "... Ви, мабуть, хочете отримати getApplicationLabel (ApplicationInfo)"
Девід

55

Якщо це не згадується в strings.xml / hardcoded в AndroidManifest.xml з будь-якої причини, як Android: label = "MyApp"

public String getAppLable(Context context) {
    PackageManager packageManager = context.getPackageManager();
    ApplicationInfo applicationInfo = null;
    try {
        applicationInfo = packageManager.getApplicationInfo(context.getApplicationInfo().packageName, 0);
    } catch (final NameNotFoundException e) {
    }
    return (String) (applicationInfo != null ? packageManager.getApplicationLabel(applicationInfo) : "Unknown");
}

Або якщо ви знаєте ідентифікатор ресурсу String, ви можете безпосередньо отримати його через

getString(R.string.appNameID);

під час читання імені додатка з string.xml, іноді, я отримую символи непотрібного характеру. Я не знаю чому .. Наприклад: à :à ¥ & # 141; ठ& # 149; à ¥ & # 136; नठ°
harikrishnan


25

З будь-якого використання контексту:

getApplicationInfo().loadLabel(getPackageManager()).toString();

15

Якщо ви знаєте назву пакета, використовуйте наступний фрагмент

ApplicationInfo ai;
try {
    ai = pm.getApplicationInfo(packageName, 0);
} catch (final NameNotFoundException e) {
    ai = null;
}
final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : "(unknown)");

1
@RishabhTayal pm позначає об'єкт PackageManager.
Vipul Shah

@VipulShah їм стає невідомо кожен раз
nida

6

Якщо вам потрібна лише назва програми, а не назва пакету, просто напишіть цей код.

 String app_name = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();

6

У Котліні використовуйте такі коди, щоб отримати ім'я програми:

        // Get App Name
        var appName: String = ""
        val applicationInfo = this.getApplicationInfo()
        val stringId = applicationInfo.labelRes
        if (stringId == 0) {
            appName = applicationInfo.nonLocalizedLabel.toString()
        }
        else {
            appName = this.getString(stringId)
        }


2

Отримайте ім'я заявки, використовуючи RunningAppProcessInfo як:

ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);
List l = am.getRunningAppProcesses();
Iterator i = l.iterator();
PackageManager pm = this.getPackageManager();
while(i.hasNext()) {
  ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo)(i.next());
  try {
    CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
    Log.w("LABEL", c.toString());
  }catch(Exception e) {
    //Name Not FOund Exception
  }
}


1

Доданий коментар джерела NonLocalizedLabelспрямовує нас зараз на:

return context.getPackageManager().getApplicationLabelFormatted(context.getApplicationInfo());

0

Ви спробували використовувати PackageManager#getActivityInfo() методом? Буде поле, яке повинно містити ім’я програми.

Дивіться відповідь на дуже схоже запитання тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.