- 此bounty已结束**。此问题的答案可获得+100的信誉奖励。奖励宽限期将在23小时后结束。android developer正在寻找来自信誉良好来源的答案。
如果你投票决定结束,请解释原因。
背景
对于我的小动态壁纸应用程序(here),我提供导入以前的壁纸。我注意到一个问题,针对API 33,这将导致我使用更广泛的存储权限(写为here和here)。
问题是
除了有问题的存储权限,我注意到,甚至获得当前的动态壁纸是有问题的。
我发现,如果没有QUERY_ALL_PACKAGES,我无法使用getWallpaperInfo找到当前的动态壁纸:
val wallpaperManager: WallpaperManager =...
val wallpaperInfo = wallpaperManager.wallpaperInfo
而且我知道如果我使用这个,我可能会在Play商店上发布应用程序时遇到麻烦,我已经有了存储权限这样的问题...
我所尝试的
我知道manifest中有queries
标记,所以我尝试了以下方法,但没有成功:
<queries>
<intent >
<action android:name="android.service.wallpaper.WallpaperService"/>
</intent>
</queries>
尝试这个背后的逻辑,是动态壁纸应用程序必须有这样的:
<service
android:name="..."
android:exported="true"
android:label="..."
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data
android:name="android.service.wallpaper" android:resource="..." />
</service>
这个问题
有什么方法可以避免使用QUERY_ALL_PACKAGES权限,并且仍然能够可靠地到达获取当前动态壁纸的API?
2条答案
按热度按时间rm5edbpk1#
QUERY_ALL_PACKAGES权限是必需的,并且enforced directly by wallpaper manager无法绕过该权限。
如果你只是想得到当前的壁纸信息,你可以使用这样的东西
uklbhaso2#
要获取当前动态壁纸应用的信息而不使用queryAllWallpapers,您可以尝试以下方法:
1.使用WallpaperManager类:
1.使用“设置.安全”类:
这两种方法都需要READ_WALLPAPER权限。
注意:queryAllWallpapers方法在API级别26(Android 8.0 Oreo)中已弃用,在API级别30(Android 11)中已移除。不建议使用此方法,因为它可能无法在所有设备上使用。