Android Flavor ACTION_CHANGE_LIVE_壁纸
嗨,我正在尝试将android应用程序风格(免费和完整)应用到生活壁纸中。在eclipse中,我曾经使用以下代码从我自己的android活动中打开实时墙纸预览:Android Flavor ACTION_CHANGE_LIVE_壁纸,android,build,live-wallpaper,variant,android-productflavors,Android,Build,Live Wallpaper,Variant,Android Productflavors,嗨,我正在尝试将android应用程序风格(免费和完整)应用到生活壁纸中。在eclipse中,我曾经使用以下代码从我自己的android活动中打开实时墙纸预览: Intent intent = new Intent(); intent.setAction(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); String pkg = WallpaperService.class.getPackage()
Intent intent = new Intent();
intent.setAction(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
String pkg = WallpaperService.class.getPackage()
.getName();
String cls = WallpaperService.class.getCanonicalName();
intent.putExtra(
WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
new ComponentName(pkg, cls));
但现在它不能正常工作,因为免费和完整版本在android studio中使用相同的包名和不同的applicationId。问题是,当它以免费或完整版本启动时,无论它是什么口味,它都将转到完整版本。我在project gradle中使用applicationId指定应用程序风格,如下所示:
productFlavors {
free {
applicationId "com.kkl.app.free"
}
full {
applicationId "com.kkl.app"
}
}
如何获得与应用程序风格匹配的正确软件包名称?您可以在
活动中调用getPackageName()
以获取Android packageName。这将是来自清单文件的packageName,即与当前applicationId相等的文件
可以找到方法文档。使用以下方法修复:
intent.setAction(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
String pkg = getPackageName();
String cls = WallpaperService.class.getCanonicalName();
intent.putExtra(
WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
new ComponentName(pkg, cls));
特别感谢Lingviston你可以用口味做很多事情,但你要做的远比任何人回答的都简单
首先,您有一个构建变量来选择调试和运行的风格。所以使用这个,否则所有调试都将使用默认的主版本
其次,您不必获取包名,只需使用build-config标志或check-flavor即可。即
android {
signingConfigs {
releaseA35Demo {
storeFile file("$projectDir/../yaskeystore.jks")
storePassword System.getenv('YOUR_APP_STUDIO_STORE_PASSWORD')
keyAlias System.getenv('YOUR_APP_STUDIO_KEY_ALIAS')
keyPassword System.getenv('YOUR_APP_STUDIO_KEY_PASSWORD')
}
}
flavorDimensions 'default'
productFlavors {
a35Demo {
dimension 'default'
applicationId "com.appstudio35.yourappstudio"
buildConfigField "String", "SERVER_URL", '"http://fakeNumbers.compute-1.amazonaws.com:3006"'
buildConfigField "int", "BUSINESS_ID", "1"
versionCode 1
versionName "0.01.01-b1"
minSdkVersion 21
}
a35DemoDev {
dimension 'default'
applicationId "com.appstudio35.yourappstudio.dev"
buildConfigField "String", "SERVER_URL", '"http://fakeNumbers2.compute-1.amazonaws.com:3006"'
buildConfigField "int", "BUSINESS_ID", "2"
versionCode 1
versionName "0.01.01-b1"
minSdkVersion 21
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
productFlavors.a35Demo.signingConfig signingConfigs.releaseA35Demo
productFlavors.a35DemoDev.signingConfig signingConfigs.releaseA35Demo
}
}
}
然后简单地在代码中引用它,如:
BuildConfig.BUSINESS_ID
无论你在哪里需要它。只要确保在库项目自动导入BuildConfig时,不会意外使用它的BuildConfig
下一个方法是,如果你想检查你的口味,你可以简单地做
BuildConfig.FLAVOR以查看您使用的是哪一个。但是,请记住,在使用它时会有一些编译器警告,因为您正在检查一种风格,而BuildConfig假定它将始终是您当前使用的构建变量下拉列表中的任何内容,这不是真的,您可以忽略这个始终为真或始终为假的警告,我向您保证它是有效的
最后,您的包问题仅仅是因为调试了错误的构建变量。我将添加一个图像,以便您可以看到在何处进行更改
希望这能有所帮助。你说得对!对pkg字符串值使用getPackageName()非常有效。但奇怪的是,cls值应该始终保持这样:“com.kkl.app,wallperService”而不是“com.kkl.app,free.wallperService”。看起来android flavor只是更改了包名,而不是像Eclipse那样更改了物理文件的目录。非常感谢你的帮助。@kkl是的,这就是它的工作原理。没什么奇怪的。这就是为什么他们将名称改为applicationId而不是packageName,以避免Java程序员之间的误解。并将组件名而不是源文件的路径传递到Intent。