【发布时间】:2011-02-08 21:12:53
【问题描述】:
我刚开始使用 android 编程,想看看是否有办法以编程方式设置锁屏图像。我在 API 中找到了各种设置壁纸的方法,但似乎找不到设置锁屏图像的等效方法。
我看到各种帖子说通过添加小部件或应用程序位来自定义锁定屏幕是不可能的,但肯定有一种方法可以通过编程设置图像?
干杯,
罗宾
【问题讨论】:
标签: java android image wallpaper
我刚开始使用 android 编程,想看看是否有办法以编程方式设置锁屏图像。我在 API 中找到了各种设置壁纸的方法,但似乎找不到设置锁屏图像的等效方法。
我看到各种帖子说通过添加小部件或应用程序位来自定义锁定屏幕是不可能的,但肯定有一种方法可以通过编程设置图像?
干杯,
罗宾
【问题讨论】:
标签: java android image wallpaper
从 API 级别 24 开始,他们添加了新方法(并更新了 documentation)和 WallpaperManager 的标志,允许您将 Wallpaper 设置到主屏幕和 Lockscreen
要将Wallpaper 设置为Lockscreen,请使用新标志WallpaperManager.FLAG_LOCK,以及采用int which 的方法之一
WallpaperManager.getInstance(this).setStream(inputStream, null, true, WallpaperManager.FLAG_LOCK);
您也可以使用以下方法之一
int setStream (InputStream bitmapData, Rect visibleCropHint, boolean allowBackup, int which)
int setResource (int resid, int which)
int setBitmap (Bitmap fullImage, Rect visibleCropHint, boolean allowBackup, int which)
一个很好的补充是您现在还可以检查是否允许您通过isSetWallpaperAllowed设置壁纸,并通过getWallpaperFile获取当前设置的壁纸
查看更新后的documentation 以获取WallpaperManager。
【讨论】:
Android 中没有“锁屏图像”。在现有的 Android、HTC Sense、MOTOBLUR 等之间肯定没有相同的“锁定屏幕图像”概念。这根本不是 Android SDK 的一部分。
Rijk 先生指出的项目是伪装成锁屏替换的安全违规行为。
【讨论】:
RemoteControlClient 在 Android 4.x 上,一个媒体 Notification 在 5.0+ 上。 Play Music 不会“控制锁屏”; Play Music 提供要在锁定屏幕上显示的信息。
有一种方法可以在三星设备上执行此操作。在意图中,您可以添加额外的内容。
intent.putExtra("SET_LOCKSCREEN_WALLPAPER", true);
startActivity(intent);
我只在部分三星手机上对此进行了测试,不能保证在未来一段时间内不会中断。谨慎使用。
【讨论】:
您可以使用 WalpaperManager 类的这三种方法,但它只适用于无版本设备或更高版本:-
public int setBitmap (Bitmap fullImage,
Rect visibleCropHint,
boolean allowBackup,
int which)
public int setResource (int resid,
int which)
public int setStream (InputStream inputStreamData,
Rect visibleCropHint,
boolean allowBackup,
int which)
这三个方法的参数:-
Bitmap/resid/inputStreamData :-这个参数接受数据
visibleCropHint:-该参数接受Rect对象,主要用于裁剪功能,更多信息参考Android developer reference website,如果你不想要裁剪功能也可以传递null
allowBackup:-boolean: 如果允许操作系统备份此壁纸图像以恢复到未来的设备,则为 true;否则为假。
which:-它是最重要的参数之一,可帮助您配置锁屏壁纸和家庭壁纸。锁屏使用 WalpaperManager.FLAG_LOCK,家庭壁纸使用 FLAG_SYSTEM
我举一个例子让你明白如何使用它:-
WalaperManager wm = WalaperManager.getInstance();
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
wm.setBitmap(bitmap,null,true,WalpaperManager.FLAG_LOCK);//For Lock screen
Toast.makeText(context.context, "done", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(context.context, "Lock screen walpaper not supported",
Toast.LENGTH_SHORT).show();
}
} catch (e: Exception) {
Toast.makeText(context.context, e.message, Toast.LENGTH_SHORT).show();
}
【讨论】:
还有另一种方法可以做到这一点。首先,您需要将要在锁定屏幕中设置的图片保存在一个文件夹中(假设它被称为“appName”)。然后,使用以下代码打开画廊,画廊打开后。引导用户打开“appName”文件夹,并选择系统图库中的图片。在图库中,用户可以将图片设置为壁纸或锁屏纸。
// 这段代码打开画廊。 startActivity(new Intent(Intent.ACTION_SET_WALLPAPER));
【讨论】:
Bitmap icon = BitmapFactory.decodeResource(getViewContext().getResources(), R.drawable.wall);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
WallpaperManager wallpaperManager = WallpaperManager.getInstance(getViewContext());
try {
wallpaperManager.setBitmap(icon, null, true, WallpaperManager.FLAG_LOCK);
} catch (IOException e) {
e.printStackTrace();
}
【讨论】:
api30+的用法
public void onWallpaperChanged(Bitmap bitmap, boolean onHomeScreen, boolean onLockScreen) {
WallpaperManager myWallpaperManager = WallpaperManager.getInstance(getApplicationContext());
try {
if(onHomeScreen) {
myWallpaperManager.setBitmap(bitmap);// For Home screen
}
if(onLockScreen) {
myWallpaperManager.setBitmap(bitmap,null,true, WallpaperManager.FLAG_LOCK);//For Lock screen
}
} catch (IOException e) {
e.printStackTrace();
}
}
【讨论】:
自 API 级别 24 起,您可以将壁纸设置为您的主屏幕、锁定屏幕或两者 :
WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// home screen
wallpaperManager.setBitmap(mBitmap, null, true, WallpaperManager.FLAG_SYSTEM);
// lock screen
wallpaperManager.setBitmap(mBitmap, null, true, WallpaperManager.FLAG_LOCK);
// home screen & lock screen
wallpaperManager.setBitmap(mBitmap, null, true, WallpaperManager.FLAG_LOCK | WallpaperManager.FLAG_SYSTEM);
} else {
wallpaperManager.setBitmap(mBitmap);
}
【讨论】: