android - 以编程方式设置锁屏壁纸 Android
问题描述
我正在使用unsplash
api 构建壁纸应用程序。我已获取图像并显示在应用程序中。我有一个按钮,它显示一个对话框以设置为主屏幕(工作正常)或锁定屏幕壁纸。
当我尝试设置锁屏壁纸时会出现这里的问题,它不会更改锁屏上的图像。这是我的代码片段:
setBtn.setOnClickListener(new View.OnClickListener() {
@TargetApi(Build.VERSION_CODES.N)
@Override
public void onClick(View view) {
if (validate()) {
if (homeCheckBox.isChecked() && largeURL != null) {
setHomeWallpaper(largeURL);
getDialog().dismiss();
}
if (lockCheckBox.isChecked() && largeURL != null) {
setLockWallpaper(largeURL);
getDialog().dismiss();
}
} else {
Toast.makeText(getContext(), "Select an Option", Toast.LENGTH_SHORT).show();
}
}
});
并设置锁屏壁纸:
private void setLockWallpaper(final String largeURL) {
final WallpaperManager wpm = WallpaperManager.getInstance(getActivity());
if (Build.VERSION.SDK_INT >= 24){
if (wpm.isSetWallpaperAllowed()) {
Log.d(TAG, "Lock Screen Wallpapers Supported");
makeLockWallpaper(wpm, largeURL);
getDialog().dismiss();
} else {
Toast.makeText(getActivity(), "Your Device Does Not Support Lock Screen Wallpapers", Toast.LENGTH_SHORT).show();
}
} else {
makeLockWallpaper(wpm, largeURL);
getDialog().dismiss();
}
}
private void makeLockWallpaper(final WallpaperManager wpm, final String largeURL) {
new Thread(new Runnable() {
@TargetApi(Build.VERSION_CODES.N)
@Override
public void run() {
URL url = null;
try {
url = new URL(largeURL);
Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
InputStream stream = Utils.bitmapToStream(bitmap);
// set wp
wpm.setStream(stream, null, true, WallpaperManager.FLAG_LOCK);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
要设置主屏幕壁纸,我使用过Picasso
这样的方法,它可以工作:
private void setHomeWallpaper(String largeURL) {
final WallpaperManager wpm = WallpaperManager.getInstance(getActivity());
Picasso.with(getActivity())
.load(largeURL)
.into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
try {
wpm.setBitmap(bitmap);
Toast.makeText(getActivity(), "Your New Wallpaper Has Been Set", Toast.LENGTH_SHORT).show();
getDialog().dismiss();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
Log.d(TAG, "Bitmap Load Failed");
Toast.makeText(getActivity(), "Could Not Set Wallpaper...Choose Another", Toast.LENGTH_SHORT).show();
getDialog().dismiss();
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
Log.d(TAG, "Prep to Load Bitmap");
}
});
}
但由于锁定屏幕的标志,我必须使用任何一个setStream or setResource
。有谁知道毕加索是否可以解决这个问题,因为至少我知道图像是否准备好,Picasso callbacks
或者建议我改进我的代码以设置锁屏壁纸。谢谢。
解决方案
推荐阅读
- c++ - 如何制作自定义字符串的 std::unorder_set 类型?
- java - 对于 repository.save(entityModel),Hibernate OneToMany 关联表字段不能为空
- haskell - 如何编写更短的代码,以便将其用于更广泛的目的?
- c++ - 带有 EnumDesktopWindows 的 printwindow 返回黑色图像
- python-3.x - groupby ,自定义函数每前 4 行使用一列(分组后)
- php - 如何“从 PHP 中的嵌套数组结构中获取数据”
- sql-server - 无法使用动态查询创建临时表
- r - ggplot2 3.2.0 版和bayesAB 绘图冲突
- sql - 在 Power BI 中的 Progress Open edge SQL 语句中组合日期字段和时间字段
- oracle-sqldeveloper - 如何显示来自 SQL Developer 的韩文字母