android 如何获取当前动态壁纸应用程序的信息,而不使用QUERY_ALL_PACKAGES权限?

gblwokeq  于 2022-12-25  发布在  Android
关注(0)|答案(2)|浏览(240)
    • bounty已结束**。此问题的答案可获得+100的信誉奖励。奖励宽限期将在23小时后结束。android developer正在寻找来自信誉良好来源的答案

如果你投票决定结束,请解释原因。

背景

对于我的小动态壁纸应用程序(here),我提供导入以前的壁纸。我注意到一个问题,针对API 33,这将导致我使用更广泛的存储权限(写为herehere)。

问题是

除了有问题的存储权限,我注意到,甚至获得当前的动态壁纸是有问题的。
我发现,如果没有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?

rm5edbpk

rm5edbpk1#

QUERY_ALL_PACKAGES权限是必需的,并且enforced directly by wallpaper manager无法绕过该权限。
如果你只是想得到当前的壁纸信息,你可以使用这样的东西

<queries>
        <intent>
            <action android:name="android.service.wallpaper.WallpaperService"/>
        </intent>
    </queries>
val currentWallpaperService = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            packageManager.resolveService(
                Intent(WallpaperService.SERVICE_INTERFACE),
                PackageManager.ResolveInfoFlags.of(PackageManager.GET_META_DATA.toLong())
            )
        } else {
            packageManager.resolveService(
                Intent(WallpaperService.SERVICE_INTERFACE),
                PackageManager.GET_META_DATA
            )
        }

        val wallpaperInfo =  WallpaperInfo(this, currentWallpaperService)
uklbhaso

uklbhaso2#

要获取当前动态壁纸应用的信息而不使用queryAllWallpapers,您可以尝试以下方法:
1.使用WallpaperManager类:

WallpaperManager wallpaperManager = WallpaperManager.getInstance(context);
WallpaperInfo wallpaperInfo = wallpaperManager.getWallpaperInfo();

if (wallpaperInfo != null) {
    // wallpaperInfo.getPackageName() gives the package name of the live wallpaper app
    // wallpaperInfo.getServiceName() gives the fully qualified name of the service component
    // that implements the live wallpaper
}

1.使用“设置.安全”类:

String liveWallpaperComponent = Settings.Secure.getString(context.getContentResolver(),
                                                         Settings.Secure.LIVE_WALLPAPER_COMPONENT);

if (!TextUtils.isEmpty(liveWallpaperComponent)) {
    // liveWallpaperComponent gives the fully qualified name of the service component
    // that implements the live wallpaper
}

这两种方法都需要READ_WALLPAPER权限。
注意:queryAllWallpapers方法在API级别26(Android 8.0 Oreo)中已弃用,在API级别30(Android 11)中已移除。不建议使用此方法,因为它可能无法在所有设备上使用。

相关问题