Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Flavor ACTION_CHANGE_LIVE_壁纸_Android_Build_Live Wallpaper_Variant_Android Productflavors - Fatal编程技术网

Android Flavor ACTION_CHANGE_LIVE_壁纸

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()

嗨,我正在尝试将android应用程序风格(免费和完整)应用到生活壁纸中。在eclipse中,我曾经使用以下代码从我自己的android活动中打开实时墙纸预览:

        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。