现在设置壁纸一般用WallpaperPicker2这个apk。但是定制的时候除了默认壁纸外,客户会让内置一些壁纸到系统,可以手动设置为壁纸。本文我们使用WallpaperPicker2作为这个需求实现的载体,下文简称wp2。
不过wp2本身是个半成品,很多功能并未完善。因此在实现这个需求的时候踩了很多坑,写个博客记录一下,大家可以参考我这个实现方式。 第一步 先将wp2默认参与编译,并设置为priv-app解决权限问题。具体怎么操作参考网上的priv-app预制和解决privapp权限不开机教程。 这里有个会踩坑的地方是有很多app的包名都叫com.android.wallpaper。例如WallpaperPicker、WallpaperPicker2、ThemePicker若是遇到一下奇怪的情况,请检查一下这三个应用是不是冲突了。 <privapp-permissions package="com.android.wallpaper">
<permission name="android.permission.SET_WALLPAPER_COMPONENT"/>
<permission name="android.permission.READ_WALLPAPER_INTERNAL"/>
<permission name="android.permission.BIND_WALLPAPER"/>
<permission name="android.permission.CUSTOMIZE_SYSTEM_UI"/>
</privapp-permissions>
第二步
开机长按Launcher空白处更换壁纸发现wp2成功内置进去后,在partner_gms/apps/GmsSampleIntegration/res/drawable增加a.png作为壁纸原图。修改xml文件如下
//vendor/partner_gms/apps/GmsSampleIntegration/res/values/config.xml
+ <string-array name="partner_wallpapers" translatable="false">
+ <item>a</item>
+ </string-array>
在WallpaperPicker2/res/drawable中增加a_small.png图片文件作为缩略图,然后修改IndividualHolder.java和IndividualPickerFragment.java
//WallpaperPicker2/src/com/android/wallpaper/picker/individual/IndividualHolder.java
@@ -57,7 +57,7 @@ abstract class IndividualHolder extends ViewHolder {
/**
* Binds the given wallpaper to this IndividualHolder.
*/
- public void bindWallpaper(WallpaperInfo wallpaper) {
+ public void bindWallpaper(WallpaperInfo wallpaper, Drawable icon) {
mWallpaper = wallpaper;
String title = wallpaper.getTitle(mActivity);
@@ -79,9 +79,10 @@ abstract class IndividualHolder extends ViewHolder {
if (overlayIcon != null) {
mOverlayIconView.setImageDrawable(overlayIcon);
} else {
- wallpaper.getThumbAsset(
- mActivity.getApplicationContext()).loadDrawable(mActivity, mThumbnailView,
- ResourceUtils.getColorAttr(mActivity, android.R.attr.colorSecondary));
+ mThumbnailView.setImageDrawable(icon);
}
}
}
//WallpaperPicker2/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
@@ -23,6 +23,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.content.res.Resources.NotFoundException;
+import android.graphics.drawable.Drawable;
import android.graphics.Point;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
@@ -148,6 +149,7 @@ public class IndividualPickerFragment extends AppbarFragment
WallpaperCategory mCategory;
WallpaperRotationInitializer mWallpaperRotationInitializer;
List<WallpaperInfo> mWallpapers;
+ ArrayList<Drawable> icons = new ArrayList<Drawable>();
Point mTileSizePx;
PackageStatusNotifier mPackageStatusNotifier;
@@ -189,7 +191,15 @@ public class IndividualPickerFragment extends AppbarFragment
mPackageStatusNotifier = injector.getPackageStatusNotifier(appContext);
mWallpapers = new ArrayList<>();
+ icons.add(getResources().getDrawable(R.drawable.a_small));
// Clear Glide's cache if night-mode changed to ensure thumbnails are reloaded
if (savedInstanceState != null && (savedInstanceState.getInt(KEY_NIGHT_MODE)
!= (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK))) {
@@ -721,7 +731,7 @@ public class IndividualPickerFragment extends AppbarFragment
int wallpaperIndex = mCategory.supportsCustomPhotos() ? position - 1 : position;
WallpaperInfo wallpaper = mWallpapers.get(wallpaperIndex);
wallpaper.computeColorInfo(holder.itemView.getContext());
- ((IndividualHolder) holder).bindWallpaper(wallpaper);
+ ((IndividualHolder) holder).bindWallpaper(wallpaper, icons.get(wallpaperIndex));
boolean isWallpaperApplied = isWallpaperApplied(wallpaper);
编译验证改动效果