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日
    浏览(12)
  • 【Android】最新版Android13使用Notification,Notification的基本使用和进阶使用

    【Android】最新版Android13使用Notification,Notification的基本使用和进阶使用

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

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

    详解Android 13种 Drawable的使用方法

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

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

    Android使用WebView打开外部网页链接

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

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

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

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

    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日
    浏览(13)
  • Android 使用 registerForActivityResult() 打开系统相册或相机获取图像

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

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

    Android 使用webView打开网页可以实现自动播放音频

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

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

    使用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日
    浏览(11)
  • 【干货】Android系统定制基础篇:第二部分(Launcher3支持键盘切换焦点、开发者模式密码确认、禁止非预装应用安装、配置时间)

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

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

    2024年02月10日
    浏览(18)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包