我知道Context.getApplicationContext()和View.getContext()的可用性,通过它们我实际上可以调用Context.getPackageName()来检索应用程序的包名。
如果我从一个View或Activity对象可用的方法中调用,它们就可以工作,但是如果我想从一个完全独立的没有View或Activity的类中找到包名,有没有办法(直接或间接地)做到这一点?
我知道Context.getApplicationContext()和View.getContext()的可用性,通过它们我实际上可以调用Context.getPackageName()来检索应用程序的包名。
如果我从一个View或Activity对象可用的方法中调用,它们就可以工作,但是如果我想从一个完全独立的没有View或Activity的类中找到包名,有没有办法(直接或间接地)做到这一点?
当前回答
使用: BuildConfig。APPLICATION_ID获取包名的任何地方(即;服务、接收方、活动、片段等)
例子: String PackageName = BuildConfig.APPLICATION_ID;
其他回答
BuildConfig。APPLICATION_ID和package可能并不总是相同的。使用“buildConfigField”让gradle添加包到BuildConfig并访问BuildConfig. package。 https://developer.android.com/studio/build/gradle-tips
defaultConfig {
applicationId "com.example.app.name"
minSdkVersion 24
targetSdkVersion 29
versionCode 1
versionName '0.1.0'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
buildConfigField("String", "PACKAGE", "\"com.example.app\"")
}
如果你使用gradle build,使用这个:BuildConfig。APPLICATION_ID获取应用程序的包名。
只需使用这段代码
val packageName = context.packageName
如果你的意思是没有一个明确的Context(例如来自后台线程),你应该在你的项目中定义一个类:
public class MyApp extends Application {
private static MyApp instance;
public static MyApp getInstance() {
return instance;
}
public static Context getContext(){
return instance;
// or return instance.getApplicationContext();
}
@Override
public void onCreate() {
instance = this;
super.onCreate();
}
}
然后在清单中,您需要将这个类添加到Application选项卡的Name字段中。或者编辑xml并放置
<application
android:name="com.example.app.MyApp"
android:icon="@drawable/icon"
android:label="@string/app_name"
.......
<activity
......
然后你可以在任何地方打电话
String packagename= MyApp.getContext().getPackageName();
希望能有所帮助。
如果你使用gradle-android-plugin来构建你的应用程序,那么你可以使用
BuildConfig.APPLICATION_ID
从任何作用域(包括静态作用域)检索包名。