从包名获取应用程序名称

96
我想要从应用程序包名中获取应用程序名称,请有人向我展示如何获取。
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());
        }
    }
}
6个回答

217

您可以使用 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
6
每次它都返回未知,我已经有包名,只想从包名中知道名称。 - nida
当我在全局接收器中使用它时,这不起作用。 - Ziv Kesten
完美的一个..只需复制粘贴..就能完成工作。谢谢。 - ABHIMANGAL MS
2
请注意,从Android 11(API 30)开始,您需要在清单中使用<queries>。如果您想查询任何包,请改用权限android.permission.QUERY_ALL_PACKAGES - Mereo4
显示剩余2条评论

46

试试这个

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()获取packageName,其中mContext = yourActivityName.this表示Activity,getActivity()表示Fragment。


22
 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 "";
    }
}

3
似乎您能够接收到新包添加的事件,之后获取与该包相关的所有信息就是一个非常简单的概念,例如应用程序名称。以下是相关概念:
-> 您的设备包管理器拥有与其相关的所有信息,所以只需创建一个对象,它将为您提供与包名称相关的所有信息。
-> 您还应该记住,意图会给出“包:真实包名”,因此首先必须通过分割(我使用)或任何其他简单的字符串实现来获取真实名称。
-> 这里是代码,希望您能得到想要的内容,我还提供了如何获取应用程序名称、应用程序图标、应用程序版本、应用程序版本代码等信息的信息。
    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());
             }
         }
      }
   }    
}

但是在卸载应用程序时,您只能得到包名,因为系统会删除所有其他信息。


intent.getData().toString() 不是正确的方法,因为意图中的数据是有结构的。 - Olaf Achthoven

0

你可以尝试下面这个方法,对我有效。

public static ArrayList<ApplicationInfo> getLaunchableInstalledApps(Context context){

    final PackageManager pm = context.getPackageManager();
    Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    ArrayList<ApplicationInfo> list = new ArrayList<>();
    for (ResolveInfo resolveInfo:pm.queryIntentActivities(intent, PackageManager.GET_META_DATA)){
        try {
            ApplicationInfo app = context.getPackageManager().getApplicationInfo(resolveInfo.activityInfo.packageName, 0);
            list.add(app);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    if (cacheAppsList.isEmpty()){
        cacheAppsList.addAll(list);
    }

    return list;
}

-2
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接