如何获取安卓锁屏壁纸?

2023-11-25

我使用下面的代码来检索 Android 8.1 手机上的 Android 锁屏壁纸:

WallpaperManager manager = WallpaperManager.getInstance(getActivity());
ParcelFileDescriptor pfd = manager.getWallpaperFile(WallpaperManager.FLAG_LOCK);
if (pfd == null) // pfd is always null for FLAG_LOCK, why?
    return;
Bitmap lockScreenWallpaper = BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor());
// ...

我已授予READ_EXTERNAL_STORAGE事先获得许可并设置锁屏壁纸。

我在真机上运行演示,发现pfd始终为空FLAG_LOCK,所以我无法获取锁屏壁纸。请帮忙解决问题,谢谢。


我自己找到了答案,希望可以帮助其他有同样问题的人。

官方文档为获取壁纸文件 says: If no lock-specific wallpaper has been configured for the given user, then this method will return null when requesting FLAG_LOCK rather than returning the system wallpaper's image file.

描述很模糊,至少不够清楚,这是什么意思?如果你将一张照片同时设置为锁屏壁纸和主屏壁纸,两者共享同一个文件,那么通过调用

ParcelFileDescriptor pfd = wallpaperManager.getWallpaperFile(WallpaperManager.FLAG_LOCK);

pfd总是为空,那么你应该这样获取锁屏壁纸:

if (pfd == null)
    pfd = wallpaperManager.getWallpaperFile(WallpaperManager.FLAG_SYSTEM);

你会得到非空的pfd。情况是这样的no lock-specific wallpaper has been configured.

相反,lock-specific wallpaper has been configured如果直接将照片设置为锁屏壁纸,wallpaperManager.getWallpaperFile(WallpaperManager.FLAG_SYSTEM)将返回一个非空值。

这是我用来检索锁屏壁纸的代码:

/**
 * please check permission outside
 * @return Bitmap or Drawable
 */
public static Object getLockScreenWallpaper(Context context)
{
    WallpaperManager wallpaperManager = WallpaperManager.getInstance(context);
    if (Build.VERSION.SDK_INT >= 24)
    {
        ParcelFileDescriptor pfd = wallpaperManager.getWallpaperFile(WallpaperManager.FLAG_LOCK);
        if (pfd == null)
            pfd = wallpaperManager.getWallpaperFile(WallpaperManager.FLAG_SYSTEM);
        if (pfd != null)
        {
            final Bitmap result = BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor());

            try
            {
                pfd.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

            return result;
        }
    }
    return wallpaperManager.getDrawable();
}

别忘了添加READ_EXTERNAL_STORAGE在清单文件中并将其授予外部。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取安卓锁屏壁纸? 的相关文章

随机推荐

  • 自定义自动隐藏浮动操作按钮行为不起作用

    我试图在 NestedScrollView 向下滚动时隐藏 FloatingActionButton 并在 NestedScrollView 向上滚动时显示自身 这是我的布局
  • 如何内省 Django 中的属性和模型字段?

    我正在尝试获取给定对象的所有现有模型字段和属性的列表 有没有一种干净的方法来内省对象 以便我可以获得字段和属性的字典 class MyModel Model url models TextField def get location sel
  • 将 JTextField 输入转换为 Integer

    我是 JAVA 新手 我试图将 JTextField 的输入转换为整数 我尝试了很多选项 但没有任何效果 Eclipse 总是给我一个错误 并且这些错误对我来说没有意义 导入java awt Graphics 导入java awt Colo
  • 如何访问 MediaBrowserServiceCompat 服务的实例?

    令人惊讶的是 我正在努力获取源自以下内容的服务实例 MediaBrowserServiceCompat 对于典型的服务 为了实现这一点 使用本地绑定器 class MyService extends MediaBrowserServiceC
  • Angular 5 - 在运行时动态加载模块(在编译时未知)

    Angular 5 是否可以动态加载编译时未知但运行时未知的模块 组件 我想这不会使用 webpack 工作 但也许使用 system js EDIT 整个想法是构建一个基于插件的应用程序 其中各个插件被放入插件文件夹中 Angular 将
  • 为多个按钮实现 onTouchListener() 的单一方法

    我想看看是否有一种方法可以创建一个方法来实现多个按钮的触摸侦听器 因为我有很多按钮几乎可以完成相同的操作 他们所做的唯一区别是他们通过我的 sendMessage 方法发送的消息 以及需要按住按钮多长时间才能发送消息 如果有办法做到这一点
  • JSF 2.0:如何在使用 HttpServletRequest.login 后重定向到受保护页面

    我正在尝试将 HttpServletRequest login 与基于表单的身份验证一起使用 一切都很好 容器告诉登录名 密码是否正确 除了用户输入登录名后 我不知道如何将用户重定向到他要求的受保护页面 重新显示登录表单 怎么做 在此先感谢
  • 生成 svn 中文件的更改历史记录

    是否可以生成一个文件 其中包括对某个文件所做的所有更改的摘要 什么 何时 由谁 VSS 中曾经有这样的选项 我认为它被称为 历史记录 它非常适合回溯并跟踪谁在何时进行了某些更改 顺便说一句 我正在使用 tortoisesvn 先感谢您 右键
  • fpdf 中单元格内的背景颜色没有变化

    我使用 fpdf 为我的报告生成 pdf 文件 对此我还是新手 我想更改单元格内的填充颜色 但每当我重新加载页面时 什么也没有 hapeens 它仍然是相同的白色填充颜色 这是我的代码 我的代码有什么问题吗 我按照设置填充颜色的正确方法进行
  • QQuickWindow透明

    我将 QQmlApplicationEngine 与 QQuickWindow 一起用于应用程序 但我不能 透明的主窗口 我想在应用程序弹出之前设置启动画面 并且我使用 Window 组件 它应该是透明的 但事实并非如此 我的 main c
  • iPhone - 从视频文件中分离音频并将其保存到单独的文件中

    有谁知道是否可以将音频从视频文件 例如 h 264 编码 mpeg 或其他此类格式 中分离出来 然后将该音频数据保存到单独的文件 例如 mp3 文件 中 这涉及到iPhone SDK 任何正确方向的指示将不胜感激 谢谢 听起来像是 AVFo
  • C++ 从 URL 解析主机 IP 地址

    给定 URL 如何解析主机 IP 地址Visual C 我不确定是否有特定的 C 类来执行主机名查找 但您始终可以使用纯 C 来执行此类操作 这是我的版本 可以在 Linux Mac OS X 和 Windows 上编译和运行 includ
  • Android:添加带有展开动画的视图(不闪烁)

    我想使用扩展动画将视图添加到视图组 因此添加的视图一开始非常小 并且占用越来越多的空间 直到达到其完整大小 可能会在此过程中移动其他视图 在尝试了不同的方法之后 我想出了下面的解决方案 如果对您有帮助 请投票 或者请发布更好的替代方案 我确
  • C# 比较两个对象模型中的数据

    我有一个对话框 当生成时 它会填充对象模型中的数据 此时 数据被复制并存储在 备份 对象模型中 当用户完成更改并单击 确定 关闭对话框时 我需要一种快速方法将备份对象模型与实时对象模型进行比较 如果发生任何更改 我可以为用户创建新的撤消状态
  • GCC 不使用 inc

    海湾合作委员会编译器 gcc version gcc GCC 4 8 2 不生成inc汇编指令 它实际上可能有用 例如在这个 C 程序中 int main int argc char argv int sum 0 int i for i 0
  • Spring CrudRepository findByInventoryIds(List inventoryIdList) - 相当于 IN 子句

    在 Spring CrudRepository 中 我们是否支持字段的 IN 子句 即类似于以下内容 findByInventoryIds List
  • 为什么 C# 在实现接口时不允许继承返回类型

    下面的代码在 C 中不合法是否有任何合理的原因 class X IA IB public X test Compliation Error saying that X is not IB return this interface IA I
  • 不带参数的 goBack() 和 pop() 功能相同吗?

    来自阅读文档看起来是这样 但我想我很困惑为什么在不带参数调用 pop 时没有指出它们是可以互换的 或者为什么甚至会有两个具有如此相似行为的不同函数 并且为什么 goBack 不接受要返回的屏幕数量的参数 pop 返回堆栈 区别在于 pop特
  • 如何从命令行定义 gradle 中的 teamcity['build.number'] 属性

    有没有办法从命令行定义 teamcity build number 属性 我尝试了 Pteamcity build number 1 但它不起作用 我有一个 build gradle 文件 其中包含此任务 distTar baseName
  • 如何获取安卓锁屏壁纸?

    我使用下面的代码来检索 Android 8 1 手机上的 Android 锁屏壁纸 WallpaperManager manager WallpaperManager getInstance getActivity ParcelFileDe