• Lv2
    粉丝0

积分32 / 贡献0

提问0答案被采纳0文章10

作者动态

[经验分享] 桌面壁纸修改

liubo-688 显示全部楼层 发表于 2025-2-25 10:25:17

壁纸API

导入模块

官方文档写着 import wallpaper from '@ohos.wallpaper';

经过调试发现上面模块不能用,需要导入,会有错误提示,但是不影响使用

<pre><b><span lang="EN-US">import </span></b><span lang="EN-US">wallpaper </span><b><span lang="EN-US">from </span></b><span lang="EN-US">'@ohos.app.wallpaperability'</span><span lang="EN-US"><o:p></o:p></span></pre>

注意:wallpaperType填入0或者1,不要使用wallpaper.WallpaperType,不是设置会不生效(0桌面壁纸,1锁屏壁纸)

将指定资源设置为指定类型的壁纸。
参数名 类型 必填 说明
source string PixelMap
wallpaperType WallpaperType 壁纸类型。
callback AsyncCallback<void> 回调函数,调用成功则返回是返回设置的结果,调用失败则返回error信息。

source传输方式有string |PixelMap,需要注意:

1、使用PixelMap传输后,setWallpaper会把PixelMap释放掉,然后导致再使用PixelMap对象是闪退

2、string 只能使用app内沙河本地路径

获取壁纸图片的像素图。
参数名 类型 必填 说明
wallpaperType WallpaperType 壁纸类型。
callback AsyncCallback<void> 回调函数,调用成功则返回壁纸图片的像素图大小,调用失败则返回error信息。

Callback回调调用

Promise回调

实现流程

1、获取相册资源

<pre><b><span lang="EN-US">import </span></b><span lang="EN-US">mediaLibrary </span><b><span lang="EN-US">from </span></b><span lang="EN-US">'@ohos.multimedia.mediaLibrary'</span><span lang="EN-US">;</span><span>获取相册列表</span><span lang="EN-US"><br/> </span><b><span lang="EN-US">async </span></b><span lang="EN-US">getAssetList</span><span lang="EN-US">()</span><span lang="EN-US">{<br/> <span>    </span></span><b><span lang="EN-US">let </span></b><span lang="EN-US">imageType </span><span lang="EN-US">= </span><span lang="EN-US">mediaLibrary</span><span lang="EN-US">.</span><span lang="EN-US">MediaType</span><span lang="EN-US">.</span><span lang="EN-US">IMAGE</span><span lang="EN-US">;<br/> <span>    </span><b>let </b></span><span lang="EN-US">fileKeyObj </span><span lang="EN-US">= <b>await </b></span><span lang="EN-US">mediaLibrary</span><span lang="EN-US">.</span><span lang="EN-US">FileKey </span><span lang="EN-US">//</span><span>文件关键信息</span><span lang="EN-US"><br/> <span>    </span></span><b><span lang="EN-US">let </span></b><span lang="EN-US">getImageOp </span><span lang="EN-US">= </span><span lang="EN-US">{<br/> <span>        </span></span><span lang="EN-US">selections</span><span lang="EN-US">: </span><span lang="EN-US">fileKeyObj</span><span lang="EN-US">.</span><span lang="EN-US">MEDIA_TYPE </span><span lang="EN-US">+ </span><span lang="EN-US">'=?'</span><span lang="EN-US">,<br/> <span>        </span></span><span lang="EN-US">selectionArgs</span><span lang="EN-US">: </span><span lang="EN-US">[</span><span lang="EN-US">imageType</span><span lang="EN-US">.</span><span lang="EN-US">toString</span><span lang="EN-US">()]</span><span lang="EN-US">,<br/> <span>        </span></span><span lang="EN-US">order</span><span lang="EN-US">: </span><span lang="EN-US">fileKeyObj</span><span lang="EN-US">.</span><span lang="EN-US">DATE_ADDED </span><span lang="EN-US">+ </span><span lang="EN-US">" DESC"</span><span lang="EN-US">,<br/> <span>        </span></span><span lang="EN-US">extendArgs</span><span lang="EN-US">: </span><span lang="EN-US">""</span><span lang="EN-US">,<br/> <span>        </span></span><span lang="EN-US">isEditable</span><span lang="EN-US">:<b>true<br/> <span>    </span></b></span><span lang="EN-US">}</span><span lang="EN-US">;<br/> <span>    </span><b>const </b></span><span lang="EN-US">fetchFileResult </span><span lang="EN-US">= <b>await </b></span><span lang="EN-US">mediaLibrary</span><span lang="EN-US">.</span><span lang="EN-US">getMediaLibrary</span><span lang="EN-US">(</span><span lang="EN-US">FeatureAbility</span><span lang="EN-US">.</span><span lang="EN-US">getContext</span><span lang="EN-US">())</span><span lang="EN-US">.</span><span lang="EN-US">getFileAssets</span><span lang="EN-US">(</span><span lang="EN-US">getImageOp</span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <br/> <span>    </span><b>var </b></span><span lang="EN-US">assetList </span><span lang="EN-US">= </span><span lang="EN-US">[]<br/> <span>    </span></span><b><span lang="EN-US">await </span></b><span lang="EN-US">fetchFileResult</span><span lang="EN-US">.</span><span lang="EN-US">getAllObject</span><span lang="EN-US">()</span><span lang="EN-US">.</span><span lang="EN-US">then</span><span lang="EN-US">((</span><span lang="EN-US">data</span><span lang="EN-US">)</span><span lang="EN-US">=></span><span lang="EN-US">{<br/> <span>        </span></span><span lang="EN-US">assetList </span><span lang="EN-US">= </span><span lang="EN-US">data<br/> <span>    </span></span><span lang="EN-US">}</span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <span>    </span></span><span lang="EN-US">Logger</span><span lang="EN-US">.</span><span lang="EN-US">log</span><span lang="EN-US">(</span><span lang="EN-US">'hans'</span><span lang="EN-US">+</span><span lang="EN-US">assetList</span><span lang="EN-US">)<br/> <span>    </span></span><b><span lang="EN-US">return </span></b><span lang="EN-US">assetList<br/> </span><span lang="EN-US">}</span><span lang="EN-US"><o:p></o:p></span></pre>

2、确定壁纸图片资源FileAsset,打开获取到FD,拷贝到本地沙河(因为公共资源路劲设置api识别不了,所以需要先拷贝到本地沙河)

<pre><b><span lang="EN-US">async </span></b><span lang="EN-US">saveImageToPath</span><span lang="EN-US">(</span><span lang="EN-US">asset</span><span lang="EN-US">,</span><span lang="EN-US">address</span><span lang="EN-US">,</span><span lang="EN-US">callBack</span><span lang="EN-US">)</span><span lang="EN-US">{<br/> <span>    </span></span><span lang="EN-US">// </span><span>检查</span><span lang="EN-US">ohos.permission.INSTALL_BUNDLE</span><span>权限是否被授予</span><span lang="EN-US"><br/> <span>    </span></span><b><span lang="EN-US">await </span></b><span lang="EN-US">asset</span><span lang="EN-US">.</span><span lang="EN-US">open</span><span lang="EN-US">(</span><span lang="EN-US">'rw'</span><span lang="EN-US">, <b>async </b></span><span lang="EN-US">(</span><span lang="EN-US">openError</span><span lang="EN-US">, </span><span lang="EN-US">fd</span><span lang="EN-US">) </span><span lang="EN-US">=> </span><span lang="EN-US">{<br/> <span>        </span></span><b><span lang="EN-US">if</span></b><span lang="EN-US">(</span><span lang="EN-US">fd </span><span lang="EN-US">> </span><span lang="EN-US">0</span><span lang="EN-US">)</span><span lang="EN-US">{<br/> <span>            </span></span><span lang="EN-US">Logger</span><span lang="EN-US">.</span><span lang="EN-US">info</span><span lang="EN-US">(</span><span lang="EN-US">'hans'</span><span lang="EN-US">+</span><span lang="EN-US">'File Open succeed!' </span><span lang="EN-US">+ </span><span lang="EN-US">address </span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <span>            </span><b>await </b></span><span lang="EN-US">fileio</span><span lang="EN-US">.</span><span lang="EN-US">copyFile</span><span lang="EN-US">(</span><span lang="EN-US">fd</span><span lang="EN-US">, </span><span lang="EN-US">address</span><span lang="EN-US">)</span><span lang="EN-US">.</span><span lang="EN-US">then</span><span lang="EN-US">(</span><b><span lang="EN-US">function</span></b><span lang="EN-US">()</span><span lang="EN-US">{<br/> <span>                </span></span><span lang="EN-US">Logger</span><span lang="EN-US">.</span><span lang="EN-US">info</span><span lang="EN-US">(</span><span lang="EN-US">'hans'</span><span lang="EN-US">+</span><span lang="EN-US">"copyFile succeed"</span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <span>                </span></span><span lang="EN-US">asset</span><span lang="EN-US">.</span><span lang="EN-US">close</span><span lang="EN-US">(</span><span lang="EN-US">fd</span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <span>                </span></span><span lang="EN-US">callBack</span><span lang="EN-US">(</span><span lang="EN-US">address</span><span lang="EN-US">)<br/> <span>            </span></span><span lang="EN-US">}</span><span lang="EN-US">)</span><span lang="EN-US">.</span><span lang="EN-US">catch</span><span lang="EN-US">(</span><b><span lang="EN-US">function</span></b><span lang="EN-US">(</span><span lang="EN-US">err</span><span lang="EN-US">)</span><span lang="EN-US">{<br/> <span>                </span></span><span lang="EN-US">Logger</span><span lang="EN-US">.</span><span lang="EN-US">info</span><span lang="EN-US">(</span><span lang="EN-US">'hans'</span><span lang="EN-US">+</span><span lang="EN-US">"copyFile failed with error:"</span><span lang="EN-US">+ </span><span lang="EN-US">err</span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <span>                </span></span><span lang="EN-US">asset</span><span lang="EN-US">.</span><span lang="EN-US">close</span><span lang="EN-US">(</span><span lang="EN-US">fd</span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <span>            </span></span><span lang="EN-US">}</span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <span>            </span></span><span lang="EN-US">Logger</span><span lang="EN-US">.</span><span lang="EN-US">info</span><span lang="EN-US">(</span><span lang="EN-US">'hans'</span><span lang="EN-US">+</span><span lang="EN-US">'File Open succeed!' </span><span lang="EN-US">+ </span><span lang="EN-US">fd</span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <span>        </span></span><span lang="EN-US">}</span><b><span lang="EN-US">else</span></b><span lang="EN-US">{<br/> <span>            </span></span><span lang="EN-US">Logger</span><span lang="EN-US">.</span><span lang="EN-US">info</span><span lang="EN-US">(</span><span lang="EN-US">'hans'</span><span lang="EN-US">+</span><span lang="EN-US">'File Open Failed!' </span><span lang="EN-US">+ </span><span lang="EN-US">openError</span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <span>        </span></span><span lang="EN-US">}<br/> <span>    </span>}</span><span lang="EN-US">)</span><span lang="EN-US">;<br/> </span><span lang="EN-US">}</span><span lang="EN-US"><o:p></o:p></span></pre>

3、开始设置壁纸,source是本地沙河图片地址,设置成功后发送订阅通知launcher刷新壁纸

<pre><b><span lang="EN-US">async </span></b><span lang="EN-US">setWallpaper</span><span lang="EN-US">(</span><span lang="EN-US">source</span><span lang="EN-US">,</span><span lang="EN-US">callBack</span><span lang="EN-US">)</span><span lang="EN-US">{<br/> <span>    </span></span><span lang="EN-US">Logger</span><span lang="EN-US">.</span><span lang="EN-US">info</span><span lang="EN-US">(</span><span lang="EN-US">'setWallpaper--->:' </span><span lang="EN-US">+ </span><span lang="EN-US">source</span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <span>    </span></span><span lang="EN-US">wallpaper</span><span lang="EN-US">.</span><span lang="EN-US">setWallpaper</span><span lang="EN-US">(</span><span lang="EN-US">source</span><span lang="EN-US">, </span><span lang="EN-US">0</span><span lang="EN-US">, </span><span lang="EN-US">(</span><span lang="EN-US">error</span><span lang="EN-US">, </span><span lang="EN-US">data</span><span lang="EN-US">) </span><span lang="EN-US">=> </span><span lang="EN-US">{<br/> <span>        </span></span><b><span lang="EN-US">if </span></b><span lang="EN-US">(</span><span lang="EN-US">error</span><span lang="EN-US">) </span><span lang="EN-US">{<br/> <span>            </span></span><span lang="EN-US">Logger</span><span lang="EN-US">.</span><span lang="EN-US">error</span><span lang="EN-US">(</span><span lang="EN-US">'hans'</span><span lang="EN-US">+</span><span lang="EN-US">failed to setWallpaper because: </span><span lang="EN-US">+ </span><span lang="EN-US">JSON</span><span lang="EN-US">.</span><span lang="EN-US">stringify</span><span lang="EN-US">(</span><span lang="EN-US">error</span><span lang="EN-US">))</span><span lang="EN-US">;<br/> <span>            </span></span><span lang="EN-US">callBack</span><span lang="EN-US">(</span><b><span lang="EN-US">false</span></b><span lang="EN-US">)<br/> <span>            </span></span><b><span lang="EN-US">return</span></b><span lang="EN-US">;<br/> <span>        </span></span><span lang="EN-US">}<br/> <span>        </span></span><span lang="EN-US">Logger</span><span lang="EN-US">.</span><span lang="EN-US">info</span><span lang="EN-US">(</span><span lang="EN-US">'hans'</span><span lang="EN-US">+</span><span lang="EN-US">succeed to setWallpaper because: </span><span lang="EN-US">+ </span><span lang="EN-US">JSON</span><span lang="EN-US">.</span><span lang="EN-US">stringify</span><span lang="EN-US">(</span><span lang="EN-US">data</span><span lang="EN-US">))</span><span lang="EN-US">;<br/> <span>        </span></span><span lang="EN-US">//</span><span>通知</span><span lang="EN-US">launcher</span><span>刷新壁纸</span><span lang="EN-US"><br/> <span>        </span></span><span lang="EN-US">CommonEvent</span><span lang="EN-US">.</span><span lang="EN-US">publish</span><span lang="EN-US">(</span><span lang="EN-US">'WallPaperChangTest'</span><span lang="EN-US">,</span><span lang="EN-US">{<br/> <span>            </span></span><span lang="EN-US">code</span><span lang="EN-US">:</span><span lang="EN-US">1008</span><span lang="EN-US">,<br/> <span>            </span></span><span lang="EN-US">data</span><span lang="EN-US">:</span><span lang="EN-US">''</span><span lang="EN-US">,<br/> <span>        </span></span><span lang="EN-US">}</span><span lang="EN-US">,</span><span lang="EN-US">(</span><span lang="EN-US">err</span><span lang="EN-US">)</span><span lang="EN-US">=></span><span lang="EN-US">{<br/> <span>            </span></span><b><span lang="EN-US">if</span></b><span lang="EN-US">(</span><span lang="EN-US">err</span><span lang="EN-US">.</span><span lang="EN-US">code</span><span lang="EN-US">)</span><span lang="EN-US">{<br/> <span>                </span></span><span lang="EN-US">console</span><span lang="EN-US">.</span><span lang="EN-US">log</span><span lang="EN-US">(</span><span lang="EN-US">'hans'</span><span lang="EN-US">+</span><span lang="EN-US">publish failed </span><span lang="EN-US">${</span><span lang="EN-US">JSON</span><span lang="EN-US">.</span><span lang="EN-US">stringify</span><span lang="EN-US">(</span><span lang="EN-US">err</span><span lang="EN-US">)</span><span lang="EN-US">}</span><span lang="EN-US"></span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <span>            </span></span><span lang="EN-US">}<span>  </span></span><b><span lang="EN-US">else<br/> <span>            </span></span></b><span lang="EN-US">{<br/> <span>                </span></span><span lang="EN-US">console</span><span lang="EN-US">.</span><span lang="EN-US">log</span><span lang="EN-US">(</span><span lang="EN-US">'hans'</span><span lang="EN-US">+</span><span lang="EN-US">publish succeed </span><span lang="EN-US">${</span><span lang="EN-US">JSON</span><span lang="EN-US">.</span><span lang="EN-US">stringify</span><span lang="EN-US">(</span><span lang="EN-US">err</span><span lang="EN-US">)</span><span lang="EN-US">}</span><span lang="EN-US"></span><span lang="EN-US">)</span><span lang="EN-US">;<br/> <span>            </span></span><span lang="EN-US">}<br/> <span>        </span>}</span><span lang="EN-US">)<br/> <span>        </span></span><span lang="EN-US">callBack</span><span lang="EN-US">(</span><b><span lang="EN-US">true</span></b><span lang="EN-US">)<br/> <span>    </span></span><span lang="EN-US">}</span><span lang="EN-US">)<br/> </span><span lang="EN-US">}</span><span lang="EN-US"><o:p></o:p></span></pre>

4、Launcher源码EntryView.ets的aboutToApperar添加壁纸改变的订阅
//创建订阅者// ---shs

CommonEvent.createSubscriber({events:["WallPaperChangTest"]}, function (err, commonEventSubscriber) {

  if (err.code) {

    console.error("hans createSubscriber failed " + JSON.stringify(err));

  } else {

    console.info("hans createSubscriber");

    subscriber = commonEventSubscriber;

    //订阅公共事件

    CommonEvent.subscribe(subscriber, that.SubscribeCallBack);

  }

});
//订阅公共事件回调// ---shs

SubscribeCallBack = (err, data) => {

  if (err.code) {

    console.error("hans subscribe failed " + JSON.stringify(err));

  } else {

    this.setWallpaperStatusStorage()

    setTimeout(()=>{

      this.requestWallpaperData()

    },700)

  }

}
5、监听改变后获取壁纸
requestWallpaperData(){

  wallpaper.getPixelMap(0, (err, data)=> {

   if (!err){

      this.changData = data

    }

  });

}
6、显示壁纸

因为源码原来使用的是backgroundImage不支持

PixelMap,所以添加Image对象

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2025  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部