Android 13 GMS 内置壁纸

56 篇文章 2 订阅
2 篇文章 0 订阅

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

扩展下,默认壁纸在

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 三方应用的壁纸

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值