Android13-EDLA 预装使用GoogleWallpaper并打开壁纸Themed icon 功能(M56 - Monochrome App icon)

这篇具有很好参考价值的文章主要介绍了Android13-EDLA 预装使用GoogleWallpaper并打开壁纸Themed icon 功能(M56 - Monochrome App icon)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

Android13-EDLA 项目中,按照认证需求,需要验证 M56 - Monochrome App icon ,具体需求如下图,可通过 Wallpaper & Style 打开/关闭 Themed Icon功能。测试发现Wallpaper & Style中没有此项设置,无法开关 Themed Icon功能 。

how to custom android 13 dark theme wallpaper?,Android13 EDLA,Android,Framework

原因分析:

因为项目中使用的是原生的壁纸(com.android.wallpaper),一开始怀疑是原生的壁纸没有Theme icon的功能设置,需要预置Google Wallpaper。

解决方案:

  • 预置Google Wallpaper
1. partner_gms/apps/ 目录下添加GoogleWallpaper 目录

how to custom android 13 dark theme wallpaper?,Android13 EDLA,Android,Framework
GoogleWallpaper.apk 可自行官网下载,Android.mk 内容如下

###############################################################################
# GoogleWallpaper
LOCAL_PATH := $(my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := GoogleWallpaper
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_USES_LIBRARIES := org.apache.http.legacy
LOCAL_OPTIONAL_USES_LIBRARIES := androidx.window.extensions androidx.window.sidecar
#LOCAL_OVERRIDES_PACKAGES :=
#LOCAL_REQUIRED_MODULES :=
include $(BUILD_PREBUILT)

LOCAL_SYSTEM_EXT_MODULE := true 预置到 system_ext 下,若没有设置此项,默认编译生成的apk会在system 分区。在system分区时需要额外添加权限白名单,不然会崩溃报错。

2. vendor/partner_gms/products/gms.mk 添加 DeskClockGoogle,添加后编包时才会编译DeskClockGoogle。
 PRODUCT_PACKAGES += \
   DeskClockGoogle \
3. 预置应用后还需要修改Launcher3 和Setting 的配置。
  • /device/xxx/common/products/tablet/overlay/packages/apps/Launcher3/res/values/config.xml
-- <string name="wallpaper_picker_package" translatable="false">com.android.wallpaper</string>
++ <string name="wallpaper_picker_package" translatable="false">com.google.android.apps.wallpaper</string>

将wallpaper_picker_package 配置成 com.google.android.apps.wallpaper。
Launcher3默认的配置文件位置在 packages/apps/Launcher3/res/values/config.xml ,因为存在overlay类,所以需要修改overlay类 才起作用。

  • device/xxx/common/products/tablet/overlay/packages/apps/Settings/res/values/config.xml

-- <string name="config_wallpaper_picker_package" translatable="false">com.android.wallpaper</string>
++ <string name="config_wallpaper_picker_package" translatable="false">com.google.android.apps.wallpaper</string>

将config_wallpaper_picker_package 设置为 com.google.android.apps.wallpaper,跟前面一起,需要修改overlay 类才起作用

4. 编译大包升级系统后,检查 Wallpaper & Style 界面是否是Google Wallpaper 的。

进入 Wallpaper & Style 界面 (Launcher3 或者Setting 进入), 串口执行指令: dumpsys window | grep “mCurrentFocus”
how to custom android 13 dark theme wallpaper?,Android13 EDLA,Android,Framework现在是 com.google.android.apps.wallpaper 则说明替换成功。

5. 替换成GoogleWallpaper 后发现,Wallpaper & Style 中 不显示 Wallpaper colors 。如下图所示,红框部分不显示。

how to custom android 13 dark theme wallpaper?,Android13 EDLA,Android,Framework

查阅官方文档发现,GoogleWallpaper 显示 Wallpaper colors 需要满足两个条件。

  1. frameworks/base/packages/SystemUI/res/values/flags.xml 中的 flag_monet 必须设置为true。
  2. 必须安装 com.google.android.apps.customization.pixel 。
    how to custom android 13 dark theme wallpaper?,Android13 EDLA,Android,Framework
6.预置 com.google.android.apps.customization.pixel

预置方法跟 GoogleWallpaper 一致,参考修改即可。
how to custom android 13 dark theme wallpaper?,Android13 EDLA,Android,Framework
Android.mk

###############################################################################
# GoogleWallpaper
LOCAL_PATH := $(my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := CustomizationPixel
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_USES_LIBRARIES := org.apache.http.legacy
#LOCAL_OPTIONAL_USES_LIBRARIES := androidx.window.extensions androidx.window.sidecar
#LOCAL_OVERRIDES_PACKAGES :=
#LOCAL_REQUIRED_MODULES :=
include $(BUILD_PREBUILT)

vendor/partner_gms/products/gms.mk 添加 CustomizationPixel

 PRODUCT_PACKAGES += \
   CustomizationPixel\

整编大包后验证有效。

7. Theam icon 不显示的问题。

由于预置的GoogleWallpaper无源码,且没有相关的文档,我们可以从Android版wallpaper分析,ThemePicker(com.android.wallpaper)。

1. 从Theam icon 字符入手,ThemePicker 中检索 Theam icon.

Theam icon —>themed_icon_title(string.xml )–>themed_icon_section_view.xml(layout)—>ThemedIconSectionView.java -->ThemedIconSectionController.java

2. ThemedIconSectionController.java 中定义了 isAvailable方法,按字面意思就是获取 Themed Icon 是否可用。
...
 @Override
    public boolean isAvailable(@Nullable Context context) {
        return context != null && mThemedIconOptionsProvider.isThemedIconAvailable();
    }
...
3. ThemedIconSwitchProvider.java
...
 /** Returns {@code true} if themed icon feature is available. 如果themed icon 功能可用返回true  */
    public boolean isThemedIconAvailable() {
        return mThemedIconUtils.isThemedIconAvailable();
    }
 ...
4. ThemedIconUtils.java (重点类)
 private ProviderInfo mProviderInfo;

    public ThemedIconUtils(Context context, String authorityMetaKey) {
        mContext = context;
        Intent homeIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME);
        ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(homeIntent,
                PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA);

        if (resolveInfo != null && resolveInfo.activityInfo.metaData != null) {
            mProviderAuthority = resolveInfo.activityInfo.metaData.getString(authorityMetaKey);
        } else {
            mProviderAuthority = null;
        }
        mProviderInfo = TextUtils.isEmpty(mProviderAuthority) ? null :
                mContext.getPackageManager().resolveContentProvider(mProviderAuthority, 0);
        if (mProviderInfo != null && !TextUtils.isEmpty(mProviderInfo.readPermission)) {
            if (mContext.checkSelfPermission(mProviderInfo.readPermission)
                    != PackageManager.PERMISSION_GRANTED) {
                mProviderInfo = null;
            }
        }
    }

 ...

    /**
     * Returns if themed icon is available.
     *
     * @return true if themed icon feature is available, false otherwise.
     */
    boolean isThemedIconAvailable() {
        return mProviderInfo != null;
    }
 ...

Themed Icon 功能是否可用是 通过判断mProviderInfo是否为空,而 mProviderInfo 是在 ThemedIconUtils 构造方法中创建。在构造函数中获取满足 CATEGORY_HOME 、MATCH_DEFAULT_ONLY 、GET_META_DATA 的 的Activity组件(resolveInfo );并获取key为authorityMetaKey的值。

ThemedIconSwitchProvider.java

...
 /** Returns the {@link ThemedIconSwitchProvider} instance. */
    public static ThemedIconSwitchProvider getInstance(Context context) {
        if (sThemedIconSwitchProvider == null) {
            Context appContext = context.getApplicationContext();
            sThemedIconSwitchProvider = new ThemedIconSwitchProvider(
                    appContext.getContentResolver(),
                    new ThemedIconUtils(appContext,
                            appContext.getString(R.string.themed_icon_metadata_key)),
                    (CustomizationPreferences) InjectorProvider.getInjector()
                            .getPreferences(appContext));
        }
        return sThemedIconSwitchProvider;
    }
...

string.xml

 <!--Name of metadata in the main launcher Activity which values contains the authority
    corresponding to a ContentProvider in launcher to query or change themed icon option  -->
<string name="themed_icon_metadata_key" translatable="false">com.android.launcher3.themedicon.option</string>
6. 也就是说,Themed Icon 功能是否支持,由满足 CATEGORY_HOME 、MATCH_DEFAULT_ONLY 、GET_META_DATA 的 的Activity组件, 是否定义的了 key值为 com.android.launcher3.themedicon.option 的 metaData 标签。而满足这个要求的Activity就是Launcher3 的Home Activity 。满足要求的有两个Activity。
  • packages/apps/Launcher3/AndroidManifest.xml 的 com.android.launcher3.Launcher
  <activity
            android:name="com.android.launcher3.Launcher"
            android:launchMode="singleTask"
            android:clearTaskOnLaunch="true"
            android:stateNotNeeded="true"
            android:windowSoftInputMode="adjustPan"
            android:screenOrientation="unspecified"
            android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenSize|screenLayout|smallestScreenSize"
            android:resizeableActivity="true"
            android:resumeWhilePausing="true"
            android:taskAffinity=""
            android:exported="true"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.SHOW_WORK_APPS" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.MONKEY"/>
                <category android:name="android.intent.category.LAUNCHER_APP" />
            </intent-filter>
            <meta-data
                android:name="com.android.launcher3.grid.control"
                android:value="${packageName}.grid_control" />
   ++       <meta-data
   ++          android:name="com.android.launcher3.themedicon.option"
   ++          android:value="${packageName}.grid_control" />
        </activity>
  • packages/apps/Launcher3/quickstep/AndroidManifest-launcher.xml 的 com.android.launcher3.uioverrides.QuickstepLauncher
  <activity
            android:name="com.android.launcher3.uioverrides.QuickstepLauncher"
            android:launchMode="singleTask"
            android:clearTaskOnLaunch="true"
            android:stateNotNeeded="true"
            android:windowSoftInputMode="adjustPan"
            android:screenOrientation="unspecified"
            android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenSize|screenLayout|smallestScreenSize"
            android:resizeableActivity="true"
            android:resumeWhilePausing="true"
            android:taskAffinity=""
            android:exported="true"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.SHOW_WORK_APPS" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.MONKEY"/>
                <category android:name="android.intent.category.LAUNCHER_APP" />
            </intent-filter>
            <meta-data
                android:name="com.android.launcher3.grid.control"
                android:value="${packageName}.grid_control" />
++         <meta-data
++              android:name="com.android.launcher3.themedicon.option"
++              android:value="${packageName}.grid_control" />
        </activity>

编译验证发现Theme Icon 正常显示,且功能正常。

总结

-其实Theme icon不显示问题跟Google Wallpaper 无关,应该在 Launcher3 的HomeActivity 配置 meta-data 即可,
感兴趣的可以自行验证测试,如有纰漏或分析错误,欢迎指出。

参考

在 aosp 中启用 Material You design文章来源地址https://www.toymoban.com/news/detail-828249.html

到了这里,关于Android13-EDLA 预装使用GoogleWallpaper并打开壁纸Themed icon 功能(M56 - Monochrome App icon)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 12 内置系统默认动态壁纸(视频资源)实现

    新建APP 项目 实现 WallpaperService 实现视频播放的引擎 AndroidManifest.xml 里注册服务 其中的 intent-filter 、action 、meta-data 都是固定写法,用于系统识别,我们需要配置的是 后面的 android:resource=“@xml/magic” 资源配置 @xml/magic 在 res 目录下,新建 xml 文件夹 然后新建 xxxx.xml(如本例:

    2023年04月26日
    浏览(257)
  • 【Android】最新版Android13使用Notification,Notification的基本使用和进阶使用

    1.1 注册一个渠道 在Android13,版本通知的使用发生了新的变化。 1.1.1 NotificationManager原生类 首先我们需要创建一个 NotificationManager 用于管理通知。 NotificationManager 仅支持在 API 等级 11(Android 3.0)及以上的设备上使用 ,因此在较旧的 Android 版本上无法使用较新的通知功能。 `

    2024年01月17日
    浏览(31)
  • 详解Android 13种 Drawable的使用方法

    关于自定义View,相信大家都已经很熟悉了。今天,我想分享一下关于自定义View中的一部分,就是自定义Drawable。 Drawable 是可绘制对象的一个抽象类,相对比View来说,它更加的纯粹,只用来处理绘制的相关工作而不处理与用户的交互事件,所以适合用来处理背景的绘制。 在介

    2024年02月06日
    浏览(25)
  • Android使用WebView打开外部网页链接

    发布Android应用,除了用原生开发外,更多是采用内嵌H5网页的方式来做,便于更新以及多平台使用。 一、第一种方式是直接通过WebView打开外部H5链接。 新建Android工程 直接创建一个工程,点击运行就可以了,打开是个空页面。 关于如何在AndroidStudio里安装AVD虚拟机,请看另外

    2024年04月24日
    浏览(30)
  • Android 12.0Launcher3 去掉workspace长按弹出壁纸弹窗

    在12.0的系统开发中,在Launcher3开发中,在长按屏幕的时候,会弹出窗口,修改主屏幕配置,壁纸,等信息,由于要默认设置一些配置 不想让用户修改相关配置,这时候就需要去掉长按弹窗功能了,禁止修改相关配置 下面来分析下workspace相关长按事件的功能实现 先看workspac

    2024年02月07日
    浏览(54)
  • Android13 adb input 调试命令使用和源码解析

    目录 一、概述 二、常用命令 2.1 输入文本 2.2 模拟按键 2.3 模拟点击 2.4 模拟滑动 2.5 模拟长按 2.6 模拟滚动 三、进阶用法 3.1 组合按键的用法 3.2 长按power键 3.3 输入中文 3.4 代码模拟发送按键 1. 方法1: 2. 方法2: 3. 方法3: 四、注意事项 五、源码解析 六、总结 好了 本篇作为And

    2024年01月20日
    浏览(48)
  • Android 使用webView打开网页可以实现自动播放音频

    使用webview 自动播放音视频,场景如,流媒体自动部分,音视频通话等。会出现如下问题:   解决方案如下: 配置webview 如下,这样可以自动播放音频。

    2024年02月12日
    浏览(49)
  • Android 使用 registerForActivityResult() 打开系统相册或相机获取图像

    当使用了 AndroidX 后,发现 `startActivityForResult()` 标记为过时了,而是推荐我们使用 `registerForActivityResult()` 函数。 `registerForActivityResult()` 函数是 Android 中用于启动 Activity 结果回调的新方式。这个函数的目的是简化在 Activity 和 Fragment 之间进行启动其他 Activity 并接收结果的过程

    2024年02月08日
    浏览(41)
  • 使用adb 命令删除手机预装app

    1. 手机开启开发者选项,允许usb调试; 2.pc 安装adb, 1)Windows版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zip 2)按键windows+r打开运行,输入sysdm.cpl,回车。 高级》环境变量》系统变量》path 3)adb --version 验证是否成功 3.通过手机助手,华为和小米的手机助手连

    2024年02月16日
    浏览(38)
  • 【干货】Android系统定制基础篇:第二部分(Launcher3支持键盘切换焦点、开发者模式密码确认、禁止非预装应用安装、配置时间)

    Android Launcher3 默认并不支持键盘操作,无法切换焦点,在一些需要支持键盘或遥控操作的设备中无法使用,因些对 Launcher3 做简单修改,使其支持键盘切换焦点。 在安全性要求比较高的产品中,一般会默认关闭『adb调试』,同时禁止用户打开『adb调试』功能。在Android8.1中默认

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包