如图,原生系统上,设备上的壁纸 显示系统内置壁纸。如果没有添加内置壁纸,就显示默认的壁纸。点击进去就是预览页面
扩展下,默认壁纸在
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
替换后的效果,点击进去显示选择图片,选择图片后是预览页面,