2011-04-30 198 views
68

我想從應用程序軟件包名稱中獲取應用程序名稱。有人請告訴我怎樣才能得到這個。從軟件包名稱中獲取應用程序名稱

public class AppInstalledListener extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     String action = intent.getAction(); 
     if(action.equals("android.intent.action.PACKAGE_ADDED")){ 
      Logger.debug("DATA:"+intent.getData().toString()); 
     } 
     if(action.equals("android.intent.action.PACKAGE_REMOVED")){ 
      Logger.debug("DATA:"+intent.getData().toString()); 
     } 
     if(action.equals("android.intent.action.PACKAGE_REPLACED")){ 
      Logger.debug("DATA:"+intent.getData().toString()); 
     } 
    } 
} 

回答

174

您可以使用PackageManager類獲得ApplicationInfo

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

在其清單的<application>標籤來定義這將返回應用程序的名稱。

+1

這是完美的。一直在尋找它幾個小時,謝謝Xion。 :D – drulabs 2012-05-15 19:28:23

+3

其返回我未知的所有時間我alrady有包名只是想知道名稱從包名 – nida 2015-02-12 15:54:46

+0

這是不工作,當我在全球接收器使用此 – 2015-11-01 09:45:21

-1
PackageManager pm = getPackageManager(); 

IntentFilter filter = new IntentFilter(); 
filter.addAction("android.intent.action.MAIN"); 
filter.addCategory("android.intent.category.HOME"); 
filter.addCategory("android.intent.category.DEFAULT"); 

Context context = getApplicationContext(); 
ComponentName component = new ComponentName(context.getPackageName(), TestReplaceHomeAppActivity.class.getName()); 

ComponentName[] components = new ComponentName[] {new ComponentName("com.android.launcher", "com.android.launcher.Launcher"), component}; 

pm.clearPackagePreferredActivities("com.android.launcher"); 
pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY, components, component); 
3

看來你是能夠接收添加新包的事件之後,它的一個非常簡單的概念,以獲取有關該包像這樣的一個信息的所有相關信息,所以這裏的應用程序名稱是概念

- >您的設備包管理器擁有與其相關的所有信息,因此只需提供所有與包名稱相關的信息即可。

- >你也應該記住,意圖給你「包:real_package_name」所以首先你必須先通過溢出(我用的)或任何其他簡單的實現字符串

得到真正的名字 - >在這裏是代碼希望你會得到你想要我,M還提供有關如何可以得到應用程序名稱,應用程序圖標,應用程序版本,應用版本代碼等信息什麼.....

public class NewAppReciver extends BroadcastReceiver{ 

@Override 
public void onReceive(Context context, Intent intent) { 
    if(intent.getAction().equals("android.intent.action.PACKAGE_ADDED")){ 
    String[] a=intent.getData().toString().split(":"); 
    String packageName=a[a.length-1]; 

    List<PackageInfo> packageInfoList =   context.getPackageManager().getInstalledPackages(0); 
    for (int i = 0; i < packageInfoList.size(); i++) { 
     PackageInfo packageInfo = packageInfoList.get(i); 
     if(packageInfo.packageName.equals(packageName)){ 
      String appName = packageInfo.applicationInfo.loadLabel(context.getPackageManager()).toString(); 
      String appVersion = packageInfo.versionName; 
      int appVerCode = packageInfo.versionCode; 
      Drawable app_icon = packageInfo.applicationInfo.loadIcon(context.getPackageManager()); 
      } 
     } 
     } 
    }  
} 

但在時間應用程序卸載您只能獲取軟件包名稱,因爲Un安裝系統會刪除所有其他信息。

+0

intent.getData()。toString()是不是要去,意圖中的數據是結構化的。 – 2016-03-21 08:31:46

21

試試這個

final String packageName = "my.application.package" 
PackageManager packageManager= getApplicationContext().getPackageManager(); 
String appName = (String) packageManager.getApplicationLabel(packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)); 

並更換packageName與你的包全名。

您可以使用mContext.getPackageName()其中mContext = yourActivityName.this的活動和getActivity()的片段得到的packageName

+1

謝謝@Nepster它真的很有用:) – 2017-05-09 14:28:18

1
public static String getAppNameFromPkgName(Context context, String Packagename) { 
    try { 
     PackageManager packageManager = context.getPackageManager(); 
     ApplicationInfo info = packageManager.getApplicationInfo(Packagename, PackageManager.GET_META_DATA); 
     String appName = (String) packageManager.getApplicationLabel(info); 
     return appName; 
    } catch (PackageManager.NameNotFoundException e) { 
     e.printStackTrace(); 
     return ""; 
    } 
} 
相關問題