Android13预置多张壁纸方案(GMS适用)

653 阅读2分钟

现在设置壁纸一般用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);

编译验证改动效果