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

120

В моем манифесте есть:

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

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

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

AndroidDev
источник

Ответы:

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как откат. Нет необходимости обертывать try / catch.

darrenp
источник
3
Это отлично работает, если вы действительно используете метку в android:name. Если вы жестко запрограммировали строку, она не работает.
Snicolas
2
Верно, но имя приложения обычно указывается через строковый ресурс. Зафиксированная строка помечается ворсом и не рекомендуется.
darrenp
1
Только будьте осторожны, если строка не будет найдена, он вызовет android.content.res.Resources $ NotFoundException
zenocon
Как советует zenocon, лучше поместить его внутрь файла try ... catch.
superarts.org
Знаете ли вы что-нибудь о документе nonLocalizableLabel ?: «... Вы, вероятно, хотите получить getApplicationLabel (ApplicationInfo)»
Дэвид
55

Если это не указано в strings.xml / жестко закодировано в 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
37
public static String getApplicationName(Context context) {
    return context.getApplicationInfo().loadLabel(context.getPackageManager());
}
Heath Borders
источник
3
loadLabel возвращает CharSequence. Думаю, тебе нужно .toString()на конец.
joshbodily
return - CharSequence или String.valueOf ();
Эриберто Ривера
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.
Випул Шах
@VipulShah, я каждый раз становлюсь неизвестным
нида,
6

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

 String app_name = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();
Пир Фахим Шах
источник
6

В 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)
        }
Джерри Чонг
источник
3

В Котлине все просто:

val appLabel = context.applicationInfo.nonLocalizedLabel
Асаф Пинхасси
источник
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()метод? Будет поле, которое должно содержать название приложения.

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

gkiar
источник