Android 13 GMS 内置壁纸

如图,原生系统上,设备上的壁纸 显示系统内置壁纸。如果没有添加内置壁纸,就显示默认的壁纸。点击进去就是预览页面

扩展下,默认壁纸在

frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png

frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png

frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png

添加默认壁纸,追溯下代码。

1.ThemePicker

当前页面是 com.android.wallpaper/.picker.CustomizationPickerActivity ,对应源码 packages/apps/ThemePicker

但是在此目录下找不到 CustomizationPickerActivity 。

查看 packages/apps/ThemePicker/Android.bp

复制代码
java_defaults {
    name: "ThemePicker_defaults",

    static_libs: [
        "guava",
        "monet",
	    "renderscript_toolkit",
        "wallpaper-common-deps",
        "SettingsLibSettingsTheme",
        "SystemUI-statsd",
        "styleprotoslite",
        "androidx.lifecycle_lifecycle-livedata-ktx",
        "androidx.lifecycle_lifecycle-runtime-ktx",
        "androidx.lifecycle_lifecycle-viewmodel-ktx",
        "androidx.recyclerview_recyclerview",
        "SystemUICustomizationLib",
    ],

    jni_libs: [
        "librenderscript-toolkit",
    ],

    srcs: [
        ":WallpaperPicker2_srcs",
        ":ThemePicker_srcs",
        ":ThemePicker_src_overrides",
    ],

    use_embedded_native_libs: true,

    resource_zips: [":WallpaperPicker2_res", ":ThemePicker_res", ":ThemePicker_res_overrides"],

    optimize: {
        enabled: false,
    },
    kotlincflags: ["-Xjvm-default=enable"],
    certificate: "",

    privileged: true,
    system_ext_specific: true,
}

//
// Build app code.
//
android_app {
    name: "ThemePicker",
    defaults: ["ThemePicker_defaults"],

    platform_apis: true,
    manifest: "AndroidManifest.xml",
    additional_manifests: [":WallpaperPicker2_Manifest"],
    overrides: ["WallpaperPicker2"],
}

ThemePicker 引用了 WallpaperPicker2,在 WallpaperPicker2 里找到了 CustomizationPickerActivity 。

2.WallpaperPicker2

找到 DefaultCategoryProvider.java ,

复制代码
	/**
     * AsyncTask subclass used for fetching all the categories and pushing them one at a time to
     * the receiver.
     */
    protected static class FetchCategoriesTask extends AsyncTask<Void, Category, Void> {
        private CategoryReceiver mReceiver;
        private PartnerProvider mPartnerProvider;
        protected final Context mAppContext;

        public FetchCategoriesTask(CategoryReceiver receiver, Context context) {
            mReceiver = receiver;
            mAppContext = context.getApplicationContext();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            mPartnerProvider = InjectorProvider.getInjector().getPartnerProvider(
                    mAppContext);

            // "My photos" wallpapers
            android.util.Log.d("luoah", "[DefaultCategoryProvider] doInBackground ,My photos wallpapers");
            publishProgress(getMyPhotosCategory());

			android.util.Log.d("luoah", "[DefaultCategoryProvider] doInBackground ,publishDeviceCategories");
            publishDeviceCategories();

            // Legacy On-device wallpapers. Only show if on mobile.
            android.util.Log.d("luoah", "[DefaultCategoryProvider] doInBackground ,getOnDeviceCategory");
            publishProgress(getOnDeviceCategory());

            // Live wallpapers -- if the device supports them.
            if (mAppContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LIVE_WALLPAPER)) {				
                List<WallpaperInfo> liveWallpapers = LiveWallpaperInfo.getAll(
                        mAppContext, getExcludedLiveWallpaperPackageNames());
				android.util.Log.d("luoah", "[DefaultCategoryProvider] doInBackground ,liveWallpapers.size():"+liveWallpapers.size());
                if (liveWallpapers.size() > 0) {
                    publishProgress(
                            new ThirdPartyLiveWallpaperCategory(
                                    mAppContext.getString(R.string.live_wallpapers_category_title),
                                    mAppContext.getString(R.string.live_wallpaper_collection_id),
                                    liveWallpapers,
                                    PRIORITY_LIVE,
                                    getExcludedLiveWallpaperPackageNames()));
                }
            }

            // Third party apps.
            android.util.Log.d("luoah", "[DefaultCategoryProvider] doInBackground ,Third party apps");
            List<ThirdPartyAppCategory> thirdPartyApps = ThirdPartyAppCategory.getAll(
                    mAppContext, PRIORITY_THIRD_PARTY, getExcludedThirdPartyPackageNames());
            for (ThirdPartyAppCategory thirdPartyApp : thirdPartyApps) {
                publishProgress(thirdPartyApp);
            }

            return null;
        }

2.1 图库上的壁纸

2.2 设备上的壁纸

packages/apps/WallpaperPicker2/src/com/android/wallpaper/module/DefaultCategoryProvider.java

getOnDeviceCategory 方法,

复制代码
        /**
         * Returns a category which incorporates both GEL and bundled wallpapers.
         */
        protected Category getOnDeviceCategory() {
            android.util.Log.d("luoah", "[DefaultCategoryProvider] getOnDeviceCategory");
			try {
                throw new Exception("luoah_getOnDeviceCategory");
            } catch (Exception e) {
                e.printStackTrace();
            }
            List<WallpaperInfo> onDeviceWallpapers = new ArrayList<>();

            if (!mPartnerProvider.shouldHideDefaultWallpaper()) {
                DefaultWallpaperInfo defaultWallpaperInfo = new DefaultWallpaperInfo();
                onDeviceWallpapers.add(defaultWallpaperInfo);
            }

            List<WallpaperInfo> partnerWallpaperInfos = PartnerWallpaperInfo.getAll(mAppContext);
            onDeviceWallpapers.addAll(partnerWallpaperInfos);

            List<WallpaperInfo> legacyPartnerWallpaperInfos = LegacyPartnerWallpaperInfo.getAll(
                    mAppContext);
            onDeviceWallpapers.addAll(legacyPartnerWallpaperInfos);

            List<WallpaperInfo> privateWallpapers = getPrivateDeviceWallpapers();
            if (privateWallpapers != null) {
                onDeviceWallpapers.addAll(privateWallpapers);
            }

            return onDeviceWallpapers.isEmpty() ? null : new WallpaperCategory(
                    mAppContext.getString(R.string.on_device_wallpapers_category_title),
                    mAppContext.getString(R.string.on_device_wallpaper_collection_id),
                    onDeviceWallpapers,
                    PRIORITY_ON_DEVICE);
        }

packages/apps/WallpaperPicker2/src/com/android/wallpaper/model/PartnerWallpaperInfo.java ,

复制代码
/**
     * @param ctx
     * @return All partner wallpapers found on the device.
     */
    public static List<WallpaperInfo> getAll(Context ctx) {
        PartnerProvider partnerProvider = InjectorProvider.getInjector().getPartnerProvider(ctx);

        List<WallpaperInfo> wallpaperInfos = new ArrayList<>();

        final Resources partnerRes = partnerProvider.getResources();
        final String packageName = partnerProvider.getPackageName();
        if (partnerRes == null) {
            return wallpaperInfos;
        }

        final int resId = partnerRes.getIdentifier(PartnerProvider.LEGACY_WALLPAPER_RES_ID, "array",
                packageName);
		android.util.Log.d("luoah", "[PartnerWallpaperInfo] getAll , packageName:"+packageName+" , resId:"+resId);
        // Certain partner configurations don't have wallpapers provided, so need to check; return
        // early if they are missing.
        if (resId == 0) {
            return wallpaperInfos;
        }

        final String[] extras = partnerRes.getStringArray(resId);
        for (String extra : extras) {
            int wpResId = partnerRes.getIdentifier(extra, "drawable", packageName);
			android.util.Log.d("luoah", "[PartnerWallpaperInfo] getAll , wpResId:"+wpResId);
            if (wpResId != 0) {
                final int thumbRes = partnerRes.getIdentifier(extra + "_small", "drawable", packageName);

                if (thumbRes != 0) {
                    final int fullRes = partnerRes.getIdentifier(extra, "drawable", packageName);
					android.util.Log.d("luoah", "[PartnerWallpaperInfo] extras in , thumbRes:"+thumbRes);
                    WallpaperInfo wallpaperInfo = new PartnerWallpaperInfo(thumbRes, fullRes);
                    wallpaperInfos.add(wallpaperInfo);
                }
            } else {
                Log.e("PartnerWallpaperInfo", "Couldn't find wallpaper " + extra);
            }
        }

        return wallpaperInfos;
    }

加打印,机器上 packageName 是 com.google.android.gmsintegration , 即 vendor/partner_gms/apps/GmsSampleIntegration

结合源码分析,在 GmsSampleIntegration 应用里加一组数组,数组元素是壁纸图片名称,

  • 添加 res/values/arrays.xml

    <resources> <string-array name="partner_wallpapers" translatable="false"> <item>wallpaper_01</item> <item>wallpaper_02</item> <item>wallpaper_03</item> <item>wallpaper_04</item> <item>wallpaper_05</item> <item>wallpaper_06</item> </string-array>
  • res_dhs_full/drawable/ 目录放入壁纸,同时存放 *_small.jpg ,

    wallpaper_01.jpg
    wallpaper_01_small.jpg
    wallpaper_02.jpg
    wallpaper_02_small.jpg
    wallpaper_03.jpg
    wallpaper_03_small.jpg
    wallpaper_04.jpg
    wallpaper_04_small.jpg
    wallpaper_05.jpg
    wallpaper_05_small.jpg
    wallpaper_06.jpg
    wallpaper_06_small.jpg

替换后的效果,点击进去显示选择图片,选择图片后是预览页面,

2.3 动态壁纸

2.4 三方应用的壁纸

相关推荐
诸神黄昏EX8 小时前
Android Safety 系列专题【篇二:AVB签名】
android
2601_949543018 小时前
Flutter for OpenHarmony垃圾分类指南App实战:意见反馈实现
android·flutter
urkay-9 小时前
Android 中实现 HMAC-SHA256
android·开发语言·python
YIN_尹9 小时前
【MySQL】增删查改的艺术——数据库CRUD完全指南(下)
android·数据库·mysql
m0_748233179 小时前
PHP8.0新特性全解析
android
一起养小猫10 小时前
Flutter for OpenHarmony 实战:从零开发一款五子棋游戏
android·前端·javascript·flutter·游戏·harmonyos
●VON10 小时前
从像素到语义:React Native Text 组件在 OpenHarmony 上的渲染哲学与工程实现
android·react native·react.js
henysugar10 小时前
Android studio编译aidl若干问题记录
android·ide·android studio·aidl
阿斌_bingyu70910 小时前
FastAdmin 混合式语言包添加繁体中文(zh-tw)完整教程
android·ide
CreeLu10 小时前
Android抓取火焰图
android