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 ฉันได้แก้ไขข้างต้นเพื่อที่จะไม่พยายามแก้ไข id ถ้าเป็น 0 จะใช้nonLocalizedLabelเป็น backoff แทน ไม่ต้องห่อลอง / จับ


3
ใช้งานได้ดีตราบใดที่คุณใช้ป้ายกำกับandroid:nameจริงๆ หากคุณฮาร์ดโค้ดสตริงแล้วจะล้มเหลว
Snicolas

2
จริง แต่โดยทั่วไปชื่อแอปจะระบุผ่านทรัพยากรสตริงแน่นอน สายอักขระแบบใช้สายแข็งถูกตั้งค่าสถานะโดยผ้าสำลีและไม่แนะนำ
darrenp

1
เพียงระวังว่ามันจะโยน android.content.res.Resources $ NotFoundException หากไม่พบสตริง
zenocon

ตามคำแนะนำของ zenocon ควรใส่ไว้ใน a try ... catch.
superarts.org

คุณรู้อะไรเกี่ยวกับ docu ของ nonLocalizableLabel หรือไม่: "... คุณอาจต้องการ getApplicationLabel (ApplicationInfo)"
David

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



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

ใน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)
        }


2

รับชื่อ Appliction โดยใช้ 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

พวกโอเคอีกตัวเลือกที่เก๋ไก๋คือ

Application.Context.ApplicationInfo.NonLocalizedLabel

ตรวจสอบฉลาก Android ที่เข้ารหัสยากในองค์ประกอบแอปพลิเคชัน

<application android:label="Big App"></application>

อ้างอิง: http://developer.android.com/reference/android/content/pm/PackageItemInfo.html#nonLocalizedLabel


1

ความคิดเห็นที่มาเพิ่มเพื่อNonLocalizedLabelนำเราไปที่:

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

0

คุณลองใช้PackageManager#getActivityInfo()วิธีนี้แล้วหรือยัง? จะมีฟิลด์ที่ควรมีชื่อของแอปพลิเคชัน

ดูคำตอบของคำถามที่คล้ายกันมากที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.