我知道Context.getApplicationContext()和View.getContext()的可用性,通过它们我实际上可以调用Context.getPackageName()来检索应用程序的包名。

如果我从一个View或Activity对象可用的方法中调用,它们就可以工作,但是如果我想从一个完全独立的没有View或Activity的类中找到包名,有没有办法(直接或间接地)做到这一点?


当前回答

对于那些正在使用Gradle的人,就像@Billda提到的,你可以通过以下途径获取包名:

BuildConfig.APPLICATION_ID

这给了你在你的应用程序gradle中声明的包名:

android {
    defaultConfig {
        applicationId "com.domain.www"
    }
}

如果您有兴趣获得java类使用的包名(有时与applicationId不同),您可以使用

BuildConfig.class.getPackage().toString()

如果你不知道该用哪一个,请阅读这里:

注意:应用程序ID过去是直接绑定到代码的 包名称;所以一些Android api使用术语“包名” 方法名和参数名,但这实际上是你的 应用程序ID。例如,Context.getPackageName()方法 返回你的应用ID。没有必要分享你的代码 应用程序代码外的真实包名。

其他回答

你可以使用未记录的方法android.app.ActivityThread.currentPackageName():

Class<?> clazz = Class.forName("android.app.ActivityThread");
Method method  = clazz.getDeclaredMethod("currentPackageName", null);
String appPackageName = (String) method.invoke(clazz, null);

注意:这必须在应用程序的主线程中完成。

感谢这篇博客文章的想法:http://blog.javia.org/static-the-android-application-package/。

只需使用这段代码

val packageName = context.packageName 

只需导入Android。App,然后你可以使用: < br / > Application.getProcessName () < br / >

获取不包含上下文、视图或活动的当前应用程序进程名。

private String getApplicationName(Context context, String data, int flag) {

   final PackageManager pckManager = context.getPackageManager();
   ApplicationInfo applicationInformation;
   try {
       applicationInformation = pckManager.getApplicationInfo(data, flag);
   } catch (PackageManager.NameNotFoundException e) {
       applicationInformation = null;
   }
   final String applicationName = (String) (applicationInformation != null ? pckManager.getApplicationLabel(applicationInformation) : "(unknown)");
   return applicationName;

}
PackageInfo pinfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
         String sVersionCode = pinfo.versionCode; // 1
         String sVersionName = pinfo.versionName; // 1.0
         String sPackName = getPackageName(); // cz.okhelp.my_app
         int nSdkVersion = Integer.parseInt(Build.VERSION.SDK); 
         int nSdkVers = Build.VERSION.SDK_INT; 

希望它能起作用。