【问题标题】:How can I get package name in android?如何在android中获取包名?
【发布时间】:2011-08-17 09:53:04
【问题描述】:

我需要自己编写一些 util 类,我需要 android 应用程序的包名。 虽然我发现只能在 Activity 等中使用的 packageManager 有上下文。我只想在我的类中获取将在 android 应用程序中使用的包名。那么我该怎么做呢?谢谢!

【问题讨论】:

  • 你需要所有已安装应用程序的包名吗?

标签: java android


【解决方案1】:

使用:getPackageManager().getPackageInfo(getPackageName(), 0).packageName 或者只是MyContext.getPackageName()

你也可以创建一个函数:

public String getPackageName(Context context) {
    return context.getPackageName();
}

【讨论】:

  • 谢谢,可能我描述的不是很清楚,是一个普通的类,所以没有Context。这个类会被打包在一个jar中,在android app中使用。所以我不能获取到达它的方法。
  • 所以创建一个这样的函数:MyFunction(Context MyContext){ MyContext.getPackageName() }
  • String pkg_name = getApplicationContext().getPackageName()
【解决方案2】:

以下常量无需上下文即可使用。

BuildConfig.APPLICATION_ID

【讨论】:

    【解决方案3】:

    可以获取已安装应用的包名:

    ArrayList<PackageInfo> res = new ArrayList<PackageInfo>();
            PackageManager pm = getApplicationContext().getPackageManager();
            List<PackageInfo> packs = pm.getInstalledPackages(0);
    

    如果你想找到你的应用的包名:

    context.getPackageName();
    

    【讨论】:

    • 谢谢,可能我描述的不是很清楚,是一个普通的类,所以没有Context。这个类会被打包在一个jar中,在android app中使用。所以我不能得到方法来达到它。谢谢大家,但你所有的答案都是一样的。
    【解决方案4】:

    getApplicationContext().getPackageName() 将给出包名。

    【讨论】:

    • 为什么?如果有人要求您不要使用它,请务必说明原因。我也不知道你为什么要求不要使用它。
    • 这将检索到错误的包名。请参阅下面的答案以始终获得正确的 java 包名称。您的答案可以通过 gradle 修改,从而产生“不准确”的包名称(即它会说调试、发布或您设置的任何构建风格)
    【解决方案5】:
    List<ApplicationInfo> packages;
        PackageManager pm;
        pm = getPackageManager();
                 get a list of installed apps.
                packages = pm.getInstalledApplications(0);
    
    ActivityManager mActivityManager = (ActivityManager) context
                    .getSystemService(Context.ACTIVITY_SERVICE);
    
       for (ApplicationInfo packageInfo : packages) {
       //packageInfo.packageName contains package name
    
    
                          }
    

    【讨论】:

    • 谢谢,可能我描述的不是很清楚,是一个普通的类,所以没有Context。这个类会被打包在一个jar中,在android app中使用。所以我不能得到方法来达到它。谢谢大家,但你所有的答案都是一样的。
    • 那么您可以发送对上下文的引用并可以这样使用它
    【解决方案6】:

    你可以这样创建一个 Util 类:

    public class AppInfo{
      private static Context cxt;
      public static String PACKAGE_INFO;
      public static String init(Context context){
        cxt = context;
        PACKAGE_INFO = cxt.getPackageName();
      }
    }
    

    那么你可以这样使用它

    public class MyActivity extends Activity{
      @Override
      public void onCreate(Bundle bundle){
        ...
        AppInfo.init(getApplicationContext());
        ...
      }
    }
    

    那么你可以这样称呼它:

    public class someClass{
      public void someMethod(){
        String packageInfo = AppInfo.PACKAGE_INFO;
        //Do what you wish
      }
    }
    

    【讨论】:

      【解决方案7】:

      我见过以下两种从 Context 变量开始获取包名的方法:

      context.getPackageManager().getPackageInfo(context.getPackageName(), 0).packageName
      

      context.getPackageName()
      

      他们不会总是给出相同的答案吗?在某些情况下,一种方式比另一种更可取吗?

      【讨论】:

        【解决方案8】:

        我认为getPackageName() 可以直接在活动中使用,而无需调用getApplicationContext。自己检查过。效果很好。

        【讨论】:

          【解决方案9】:

          在此处将其添加到您的 util 类中。它确保处理不同的“风格”和调试/发布版本,因为其他答案没有:

          @Nullable
          public static String getApplicationPackageName(@NonNull Context context)
          {
              final PackageInfo packageInfo = getPackageInfo(context);
              if (packageInfo.applicationInfo == null)
              {
                  return null;
              }
              // Returns the correct “java” package name that was defined in your
              // AndroidManifest.xml.
              return packageInfo.applicationInfo.packageName;
          }
          
          // Convenience method for getting the applications package info.
          @NonNull
          private static PackageInfo getPackageInfo(@NonNull final Context context)
          {
              final PackageManager packageManager = context.getPackageManager();
          
              try
              {
                  return packageManager.getPackageInfo(context.getPackageName(), 0);
              }
              catch (final PackageManager.NameNotFoundException ignored)
              {
                  //noinspection ConstantConditions: packageInfo should always be available for the embedding app.
                  return null;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2012-01-28
            • 2020-03-19
            • 1970-01-01
            • 2013-03-14
            • 1970-01-01
            • 2012-10-09
            • 2013-01-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多