Я нахожу ответ сам, надеюсь, он может помочь другим с таким же вопросом.
Официальные документы для getWallpaperFile говорят: 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
всегда будет иметь значение null, тогда вы должны получить обои экрана блокировкипуть:
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
в файл манифеста и предоставить его снаружи.