OpenHarmony开发者论坛
标题:
桌面壁纸修改
[打印本页]
作者:
liubo-688
时间:
2025-2-25 10:25
标题:
桌面壁纸修改
[md]#### 壁纸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](
https://docs.openharmony.cn/page ... image.md/#pixelmap7
) | |
| wallpaperType | [WallpaperType](
https://docs.openharmony.cn/page ... r.md/#wallpapertype
) | 是 | 壁纸类型。 |
| callback | AsyncCallback<void> | 是 | 回调函数,调用成功则返回是返回设置的结果,调用失败则返回error信息。 |
source传输方式有string |[PixelMap](
https://docs.openharmony.cn/page ... image.md/#pixelmap7
),需要注意:
1、使用[PixelMap](
https://docs.openharmony.cn/page ... image.md/#pixelmap7
)传输后,setWallpaper会把[PixelMap](
https://docs.openharmony.cn/page ... image.md/#pixelmap7
)释放掉,然后导致再使用[PixelMap](
https://docs.openharmony.cn/page ... image.md/#pixelmap7
)对象是闪退
2、string 只能使用app内沙河本地路径

##### 获取壁纸图片的像素图。
| **参数名** | **类型** | **必填** | **说明** |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------- | ----------------------------------------------------------------------- |
| wallpaperType | [WallpaperType](
https://docs.openharmony.cn/page ... r.md/#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对象

[/md]
欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/)
Powered by Discuz! X3.5