如何在不使用 QUERY_ALL_PACKAGES 权限的情况下获取有关当前动态壁纸应用程序的信息?

问题描述 投票:0回答:2

如果您投票关闭此功能,请解释原因。

背景

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

问题

除了有问题的存储权限外,我注意到即使获取当前的动态壁纸也是有问题的。

我发现没有 QUERY_ALL_PACKAGES ,我无法使用 getWallpaperInfo:

找到当前动态壁纸
val wallpaperManager: WallpaperManager =...
val wallpaperInfo = wallpaperManager.wallpaperInfo

而且我知道如果我使用它,我可能无法在 Play 商店中发布该应用程序。我已经有这样的存储权限问题......

我试过的

我知道清单中的

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?

android android-permissions live-wallpaper
2个回答
1
投票

QUERY_ALL_PACKAGES 权限是必需的,并且由墙纸管理器直接强制执行没有办法解决它。

如果你只是想获得当前的壁纸信息,你可以使用这样的东西

  <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)

0
投票

Google 似乎已经注意到了这个问题,并进行了一些调整,以便至少在 Android 14 上我提到的查询可以工作:

返回有关主屏幕壁纸的信息,如果它是当前的 wallpaper 是一个动态壁纸组件。否则,如果墙纸 是静态图像,这将返回 null。

为了使用这个,应用程序应该声明一个标签 动作“android.service.wallpaper.WallpaperService”。否则,这 如果调用者没有其他方法,方法将返回 null 壁纸包的可见性。

因此,如果您的应用程序应该在 Android 13 及以下版本上运行,则需要 QUERY_ALL_PACKAGES,但在 Android 14 及更高版本上,您只需查询即可。

这一次,Play 政策团队也批准了这种事情。这与获取墙纸图像相反,后者需要 MANAGE_EXTERNAL_STORAGE 权限:

https://issuetracker.google.com/issues/237124750

无论如何,解决方案是:

<uses-permission
    android:name="android.permission.QUERY_ALL_PACKAGES" android:maxSdkVersion="33"
    tools:ignore="QueryAllPackagesPermission" />

<queries>
    <intent>
        <action android:name="android.service.wallpaper.WallpaperService"/>
    </intent>
</queries>
© www.soinside.com 2019 - 2024. All rights reserved.