【发布时间】:2011-08-17 09:53:04
【问题描述】:
我需要自己编写一些 util 类,我需要 android 应用程序的包名。 虽然我发现只能在 Activity 等中使用的 packageManager 有上下文。我只想在我的类中获取将在 android 应用程序中使用的包名。那么我该怎么做呢?谢谢!
【问题讨论】:
-
你需要所有已安装应用程序的包名吗?
我需要自己编写一些 util 类,我需要 android 应用程序的包名。 虽然我发现只能在 Activity 等中使用的 packageManager 有上下文。我只想在我的类中获取将在 android 应用程序中使用的包名。那么我该怎么做呢?谢谢!
【问题讨论】:
使用:getPackageManager().getPackageInfo(getPackageName(), 0).packageName
或者只是MyContext.getPackageName()
你也可以创建一个函数:
public String getPackageName(Context context) {
return context.getPackageName();
}
【讨论】:
MyFunction(Context MyContext){ MyContext.getPackageName() }
String pkg_name = getApplicationContext().getPackageName()
以下常量无需上下文即可使用。
BuildConfig.APPLICATION_ID
【讨论】:
可以获取已安装应用的包名:
ArrayList<PackageInfo> res = new ArrayList<PackageInfo>();
PackageManager pm = getApplicationContext().getPackageManager();
List<PackageInfo> packs = pm.getInstalledPackages(0);
如果你想找到你的应用的包名:
context.getPackageName();
【讨论】:
getApplicationContext().getPackageName() 将给出包名。
【讨论】:
java 包名称。您的答案可以通过 gradle 修改,从而产生“不准确”的包名称(即它会说调试、发布或您设置的任何构建风格)
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
}
【讨论】:
你可以这样创建一个 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
}
}
【讨论】:
我见过以下两种从 Context 变量开始获取包名的方法:
context.getPackageManager().getPackageInfo(context.getPackageName(), 0).packageName
和
context.getPackageName()
他们不会总是给出相同的答案吗?在某些情况下,一种方式比另一种更可取吗?
【讨论】:
我认为getPackageName() 可以直接在活动中使用,而无需调用getApplicationContext。自己检查过。效果很好。
【讨论】:
在此处将其添加到您的 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;
}
}
【讨论】: