Android AAOS13 原生 Launcher3 壁纸获取方式
目录
- 一、整体架构
- 二、壁纸获取的核心路径
- [三、AAOS13 特殊处理](#三、AAOS13 特殊处理 "#%E4%B8%89aaos13-%E7%89%B9%E6%AE%8A%E5%A4%84%E7%90%86")
- [四、壁纸获取的 Binder 调用链](#四、壁纸获取的 Binder 调用链 "#%E5%9B%9B%E5%A3%81%E7%BA%B8%E8%8E%B7%E5%8F%96%E7%9A%84-binder-%E8%B0%83%E7%94%A8%E9%93%BE")
- 五、壁纸存储路径
- 六、关键源码位置
- 七、获取壁纸的完整示例
- [八、AAOS13 壁纸限制](#八、AAOS13 壁纸限制 "#%E5%85%ABaaos13-%E5%A3%81%E7%BA%B8%E9%99%90%E5%88%B6")
一、整体架构
在 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 壁纸限制
- 驾驶模式限制:车辆行驶时禁用壁纸选择功能
- 性能限制:壁纸加载不能影响车载系统响应速度
- 尺寸限制:适配车载屏幕比例(通常超宽屏)
- 存储限制:车载系统存储空间有限,壁纸缓存需控制
总结
Android AAOS13 中 Launcher3 的壁纸获取主要通过 WallpaperManager API,底层通过 Binder IPC 与 WallpaperManagerService 通信。