Android - Cách lấy tên ứng dụng? (Không phải tên gói)


120

Trong bản kê khai của mình, tôi có:

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

Làm cách nào để lấy phần tử nhãn?

Lưu ý: Mã của tôi đang chạy bên trong mã của người khác, vì vậy tôi không có quyền truy cập vào @ string / app_name

Câu trả lời:


182

Có một cách dễ dàng hơn các câu trả lời khác không yêu cầu bạn đặt tên tài nguyên một cách rõ ràng hoặc lo lắng về các ngoại lệ với tên gói. Nó cũng hoạt động nếu bạn đã sử dụng một chuỗi trực tiếp thay vì một tài nguyên.

Cứ làm đi:

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

Hi vọng điêu nay co ich.

Biên tập

Theo nhận xét từ Snicolas, tôi đã sửa đổi ở trên để nó không cố gắng giải quyết id nếu nó là 0. Thay vào đó, nó sử dụng, nonLocalizedLabelnhư một sự hỗ trợ. Không cần gói thử / bắt.


3
Điều này hoạt động tốt, miễn là bạn thực sự sử dụng một nhãn android:name. Nếu bạn mã hóa cứng một chuỗi, thì nó không thành công.
Snicolas

2
Đúng nhưng tên ứng dụng thường được chỉ định thông qua tài nguyên chuỗi. Một dây cứng được gắn cờ bởi lint và không được khuyên.
darrenp

1
Chỉ cần xét rằng nó sẽ ném android.content.res.Resources $ NotFoundException nếu chuỗi không được tìm thấy
zenocon

Theo lời khuyên của zenocon, tốt hơn nên đặt nó vào bên trong a try ... catch.
superarts.org

Bạn có biết điều gì đó về tài liệu của nonLocalizableLabel không ?: "... Bạn có thể muốn getApplicationLabel (ApplicationInfo)"
David

55

Nếu không được đề cập trong string.xml / hardcoded trong AndroidManifest.xml vì bất kỳ lý do gì như 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");
}

Hoặc nếu bạn biết ID tài nguyên chuỗi thì bạn có thể trực tiếp lấy nó qua

getString(R.string.appNameID);

trong khi đọc Tên ứng dụng từ string.xml, đôi khi, nhận được các ký tự rác. Tôi không biết lý do tại sao ..Ex: à¤¸à ¥ & # 141; & # 149 à¤; à ¥ & # 136; नठ°
harikrishnan

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

3
loadLabel trả về a CharSequence. Tôi nghĩ rằng bạn cần .toString()vào cuối.
joshbodily

trả về là CharSequence hoặc String.valueOf ();
Heriberto Rivera

25

Từ bất kỳ việc sử dụng Ngữ cảnh nào:

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

15

Nếu bạn biết Tên gói thì hãy sử dụng đoạn mã sau

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 biểu thị đối tượng PackageManager.
Vipul Shah

@VipulShah, lúc nào tôi cũng không biết
nida

6

Nếu bạn chỉ cần tên ứng dụng, không phải tên gói, thì chỉ cần viết mã này.

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

6

Trong Kotlin , sử dụng các mã sau để nhận Tên ứng dụng:

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

Trong Kotlin, nó đơn giản:

val appLabel = context.applicationInfo.nonLocalizedLabel

2

Lấy tên ứng dụng bằng RunningAppProcessInfo như:

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

Nhận xét nguồn được thêm vào để NonLocalizedLabelhướng chúng tôi bây giờ đến:

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

0

Bạn đã thử sử dụng PackageManager#getActivityInfo()phương pháp này chưa? Sẽ có một trường chứa tên của ứng dụng.

Xem câu trả lời cho một câu hỏi tương tự ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.