Android AOSP13 原生 Launcher3 壁纸获取方式

Android AAOS13 原生 Launcher3 壁纸获取方式

目录


一、整体架构

在 Android 13 (包括 AAOS13) 中,Launcher3 的壁纸功能涉及以下核心组件:

scss 复制代码
Launcher3 (主进程)
    ↓
WallpaperPickerActivity (壁纸选择器)
    ↓
WallpaperManager (系统服务)
    ↓
IWallpaperManager.aidl (Binder IPC)
    ↓
WallpaperManagerService (system_server)

二、壁纸获取的核心路径

2.1 WallpaperManager API(应用层入口)

ini 复制代码
// 获取 WallpaperManager 实例
WallpaperManager wallpaperManager = WallpaperManager.getInstance(context);

// 获取当前壁纸
Drawable wallpaper = wallpaperManager.getDrawable();

// 获取壁纸 Bitmap
Bitmap wallpaperBitmap = ((BitmapDrawable) wallpaper).getBitmap();

关键方法:

方法 说明
getDrawable() 获取当前壁纸的 Drawable
getBitmap() 获取壁纸的 Bitmap(需要转换)
peekDrawable() 获取壁纸但不加载到内存
getWallpaperInfo() 获取动态壁纸的元信息

2.2 Launcher3 中的壁纸加载流程

WallpaperPickerActivity 中:

scala 复制代码
// packages/apps/Launcher3/src/com/android/launcher3/WallpaperPickerActivity.java

public class WallpaperPickerActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 1. 初始化 WallpaperManager
        WallpaperManager wm = WallpaperManager.getInstance(this);

        // 2. 获取当前壁纸
        Drawable currentWallpaper = wm.getDrawable();

        // 3. 加载系统预设壁纸
        loadSystemWallpapers();

        // 4. 加载第三方壁纸包
        loadThirdPartyWallpapers();
    }

    private void loadSystemWallpapers() {
        // 从系统资源加载壁纸
        // 路径: /system/etc/wallpaper/
        // 或资源: frameworks/base/core/res/res/drawable*/
    }
}

2.3 壁纸数据源

Launcher3 从以下来源获取壁纸:

来源 路径/方式 说明
系统预设壁纸 /system/etc/wallpaper/ 厂商预置的静态壁纸
系统资源 frameworks-res AOSP 默认壁纸
壁纸包 第三方 APK Live Wallpaper 或壁纸集合应用
用户图片 MediaStore 用户相册中的图片
当前壁纸 WallpaperManager 已设置的壁纸

三、AAOS13 特殊处理

3.1 车载适配

scala 复制代码
// packages/apps/Launcher3/car/src/com/android/car/launcher/CarWallpaperPickerActivity.java

public class CarWallpaperPickerActivity extends Activity {

    // AAOS 针对 car 场景的特殊处理
    private void loadCarWallpapers() {
        // 1. 车载屏幕适配 - 考虑横屏比例
        // 2. 驾驶模式限制 - 行驶中禁用壁纸选择
        // 3. 性能优化 - 减少壁纸加载对系统性能影响
    }
}

3.2 壁纸尺寸适配

arduino 复制代码
// 车载屏幕通常为横屏,壁纸需要特殊裁剪
public Bitmap adjustWallpaperForCar(Bitmap original, int displayWidth, int displayHeight) {
    // 车载屏幕比例通常是 16:9 或更宽
    float carRatio = (float) displayWidth / displayHeight;

    // 根据比例裁剪壁纸
    return cropBitmapToRatio(original, carRatio);
}

四、壁纸获取的 Binder 调用链

scss 复制代码
[App Process]
WallpaperManager.getDrawable()
    ↓
WallpaperManager.forgetLoadedWallpaper()
    ↓
IWallpaperManager.getDrawable()
    ↓ (Binder IPC)

[System Server Process]
WallpaperManagerService.getDrawable()
    ↓
WallpaperManagerService.loadBitmapLocked()
    ↓
打开 /data/system/users/0/wallpaper
    ↓
返回 ParcelFileDescriptor

五、壁纸存储路径

路径 说明
/data/system/users/0/wallpaper 当前用户的主屏幕壁纸
/data/system/users/0/wallpaper_orig 原始壁纸(未裁剪)
/data/system/users/0/lock_wallpaper 锁屏壁纸(Android 14+)
/data/system/users/0/wallpaper_info.xml 壁纸元信息

六、关键源码位置

bash 复制代码
# Launcher3 壁纸相关代码
packages/apps/Launcher3/
├── src/com/android/launcher3/
│   ├── WallpaperPickerActivity.java      # 壁纸选择器主 Activity
│   ├── WallpaperCropActivity.java        # 壁纸裁剪
│   └── util/WallpaperUtils.java          # 壁纸工具类
│
└── res/
    └── layout/wallpaper_picker.xml       # 壁纸选择器布局

# WallpaperManager
frameworks/base/core/java/android/app/WallpaperManager.java

# WallpaperManagerService
frameworks/base/services/core/java/com/android/server/wm/WallpaperManagerService.java

七、获取壁纸的完整示例

arduino 复制代码
public class WallpaperHelper {

    /**
     * 获取当前壁纸 Bitmap
     */
    public static Bitmap getCurrentWallpaper(Context context) {
        WallpaperManager wm = WallpaperManager.getInstance(context);
        Drawable drawable = wm.getDrawable();

        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        }

        // 处理其他 Drawable 类型
        return drawableToBitmap(drawable);
    }

    /**
     * 获取壁纸尺寸
     */
    public static Point getWallpaperSize(Context context) {
        WallpaperManager wm = WallpaperManager.getInstance(context);
        return new Point(wm.getDesiredMinimumWidth(), wm.getDesiredMinimumHeight());
    }

    /**
     * 获取壁纸文件路径(需要系统权限)
     */
    public static String getWallpaperFilePath(int userId) {
        return "/data/system/users/" + userId + "/wallpaper";
    }

    private static Bitmap drawableToBitmap(Drawable drawable) {
        int width = drawable.getIntrinsicWidth();
        int height = drawable.getIntrinsicHeight();

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, width, height);
        drawable.draw(canvas);

        return bitmap;
    }
}

八、AAOS13 壁纸限制

  1. 驾驶模式限制:车辆行驶时禁用壁纸选择功能
  2. 性能限制:壁纸加载不能影响车载系统响应速度
  3. 尺寸限制:适配车载屏幕比例(通常超宽屏)
  4. 存储限制:车载系统存储空间有限,壁纸缓存需控制

总结

Android AAOS13 中 Launcher3 的壁纸获取主要通过 WallpaperManager API,底层通过 Binder IPC 与 WallpaperManagerService 通信。


相关推荐
TDengine (老段)3 小时前
TDengine RAFT共识协议 — 选举、日志复制、快照与仲裁
android·大数据·数据库·物联网·架构·时序数据库·tdengine
YF02116 小时前
深入剖析 Kotlin 的高效之道与核心实战
android·kotlin·app
程序员码歌6 小时前
别再让 AI 自由发挥了:OpenSpec 才是团队协作不跑偏的关键
android·前端·人工智能
敲代码的鱼7 小时前
NFC读卡能力 支持安卓/iOS/鸿蒙 UTS插件
android·ios·uni-app
刮风那天7 小时前
Android 常驻进程如何被查杀?
android
刮风那天8 小时前
Android 如何降低进程优先级可以被查杀?
android
资源分享助手10 小时前
超级改图P图改字无限制版教程(安卓)AI改图软件、图片改字软件、安卓修图APP、智能消除工具、图片拼接APP、超级改图下载
android·人工智能
Lehjy10 小时前
【Linux】文件系统磁盘存储结构
android·linux·运维
BU摆烂会噶11 小时前
【LangGraph】节点内调用与状态隔离
android·人工智能·python·ui·langchain·人机交互
BU摆烂会噶12 小时前
【LangGraph】作为节点添加与状态共享
android·人工智能·python·ui·langchain·人机交互