Android - Как узнать название приложения? (Не имя пакета)

В моем манифесте я имею:

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

Как получить элемент метки?

Примечание. Мой код выполняется внутри чужого кода, поэтому у меня нет доступа к @string/app_name

Ответ 1

Там проще, чем другие ответы, которые не требуют явного указания ресурса или беспокойства об исключениях с именами пакетов. Он также работает, если вы использовали строку напрямую, а не ресурс.

Просто выполните:

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

Надеюсь, что это поможет.

Edit

В свете комментария от Snicolas я изменил приведенное выше, чтобы он не пытался разрешить идентификатор, если он равен 0. Вместо этого он использует nonLocalizedLabel как отсрочку. Нет необходимости в обертке в try/catch.

Ответ 2

Если это не указано в файле 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);

Ответ 3

public static String getApplicationName(Context context) {
    return context.getApplicationInfo().loadLabel(context.getPackageManager());
}

Ответ 4

Из любого использования контекста:

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

Ответ 5

Если вы знаете имя пакета, используйте следующий фрагмент

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

Ответ 6

Если вам нужно только имя приложения, а не имя пакета, просто напишите этот код.

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

Ответ 7

Получить имя приложения с помощью RunningAppProcessInfo as:

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

Ответ 9

В Kotlin используйте следующие коды, чтобы получить Имя приложения:

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

Ответ 10

Пробовали ли вы использовать метод PackageManager#getActivityInfo()? Будет поле, которое должно содержать имя приложения.

См. ответ на очень похожий вопрос здесь.

Ответ 11

Исходный комментарий, добавленный к NonLocalizedLabel направляет нас к:

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